很明顯,當前行的狀態只與前一行有關
並且當前行的狀態與前一行的狀態(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...