hdu1565 狀壓DP做的

2021-06-22 22:45:34 字數 672 閱讀 1270

/******

題意:從乙個矩陣中選出一些數,選出的數不能相鄰,求能選出的最大的和;

思路:狀壓dp 也可以用什麼流做,不過現在不懂圖論

*******/

#include #include #include #include #define inf 0xfffffff

using namespace std;

int dp[20][17777], a[20][20], cnt, s[1<<20], num1[20][17777], n;

int num(int i, int k)

bool can(int k)

void dp()}}

}int main()

int i,j,k;

cnt=0;

for(i=0;ifor(j=0;jscanf("%d", &a[i][j]);

for(k=0;k<(1

dp();

int ans=0;

for(j=0;jans=max(ans,dp[n-1][j]);

printf("%d\n", ans);

}return 0;

}

狀壓dp入門 hdu1565

思路 將數字轉化為2進製,表示每一行被選的數字的情況,首先預處理哪些數字是可以取得的合法狀態,因為上下行之間沒有公共邊,可以通過這一條件知道合法狀態滿足右移或左移以為後 運算的和為0,將所有哥發的存入陣列中。然後直接暴力三重迴圈,用陣列f i j 表示前i行的第i行選取狀態用j的二進位制的表示的最大...

hdu 1565 狀壓dp入門題)

很明顯,當前行的狀態只與前一行有關 並且當前行的狀態與前一行的狀態 i j 0時才滿足條件 預處理出每種可能的狀態 從前往後列舉每一行的狀態 再列舉前一行的狀態 dp儲存該狀態下最優結果 pragma warning disable 4996 include include include incl...

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

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