HDU 1565 方格取數 1 狀壓DP

2021-07-13 06:01:17 字數 912 閱讀 3639

description

給你乙個n*n的格仔的棋盤,每個格仔裡面有乙個非負數。 

從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。

input

包括多個測試例項,每個測試例項包括乙個整數n 和n*n個非負數(n<=20)

output

對於每個測試例項,輸出可能取得的最大的和

sample input

3

75 15 21

75 15 28

34 70 5

sample output

188 

source

狀態d[i][j]表示第i行的第j個可用狀態結果,所以先預處理所有可用狀態,一開始直接處理了1-(1<<20)的所以一直超時 = =;然後對於每個狀態把其包含的所有格仔求和,如果當前狀態與上一行的狀態之間無衝突,則取所有上一行狀態加上剛剛求得和的最大值,狀態方程:d[i][j] = max(d[i][j],d[i-1][k]+t);

#include #include #include #include using namespace std;

const int maxn = 23;

int a[maxn][maxn],n;

int d[maxn][20000],tot = 0,can[20000];

bool ok(int t)

else flag = false;

t>>= 1;

}return true;

}int main(){

while(~scanf("%d",&n)){

tot = 0;

for(int i=0;i<=(1<

HDU 1565 方格取數 1 (狀壓DP)

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...

HDU 1565 方格取數 1 狀壓dp

解題思路 dp i j 代表到第i行的第j個狀態所能得到的最大的和,可以先處理一行沒有兩個相鄰的滿足條件的狀態。然後把每行每個狀態的和都算出來,狀態轉移的條件是當前這行第j個狀態與上一行的第k個狀態想與為0,即沒有相鄰的,那就能更新dp i j dp i j max dp i j dp i 1 k ...

HDU 1565 方格取數 1

hdu 1565 方格取數 1 我的第乙個狀態壓縮dp 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數,從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大 3 75 15 21 75 15 28 34 70 5 188對於每乙個數...