hdu 1565 狀壓dp入門題)

2022-06-12 13:51:15 字數 607 閱讀 8608

很明顯,當前行的狀態只與前一行有關

並且當前行的狀態與前一行的狀態(i&j)==0時才滿足條件

預處理出每種可能的狀態

從前往後列舉每一行的狀態

再列舉前一行的狀態

dp儲存該狀態下最優結果

#pragma warning (disable : 4996)

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

const int maxn = 1e6 + 10;

int dp[19][1 << 17];

int a[22][22];

int tot[maxn];//存所有可能狀態

int get_sum(int row, int x)

return res;

}int main()

}} int ans = 0;

for (int i = 0; i < cnt; ++i) ans = max(dp[n][i], ans);

cout << ans << endl;

} return 0;

}

狀壓dp入門 hdu1565

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

hdu1565 狀壓DP做的

題意 從乙個矩陣中選出一些數,選出的數不能相鄰,求能選出的最大的和 思路 狀壓dp 也可以用什麼流做,不過現在不懂圖論 include include include include define inf 0xfffffff using namespace std int dp 20 17777 a...

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

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