思路:將數字轉化為2進製,表示每一行被選的數字的情況,首先預處理哪些數字是可以取得的合法狀態,因為上下行之間沒有公共邊,可以通過這一條件知道合法狀態滿足右移或左移以為後&運算的和為0,將所有哥發的存入陣列中。
然後直接暴力三重迴圈,用陣列f[i][j]表示前i行的第i行選取狀態用j的二進位制的表示的最大值,通過dp
更新陣列,最後得到結果。
#include
const
int inf=
0x3f3f3f3f
;const
int maxn=
1<<17;
using
namespace std;
typedef
long
long ll;
int t[maxn]
;//可以取得合法狀態
int a[22]
[22];
int f[22]
[maxn]
;int
add(
int i,
int x)
return res;
}//計算第i行,x狀態下的和
int main ()}
}}int m=0;
for(
int i=
1;i<=cnt;i++
)printf
("%d\n"
,m);
}return0;
}
hdu 1565 狀壓dp入門題)
很明顯,當前行的狀態只與前一行有關 並且當前行的狀態與前一行的狀態 i j 0時才滿足條件 預處理出每種可能的狀態 從前往後列舉每一行的狀態 再列舉前一行的狀態 dp儲存該狀態下最優結果 pragma warning disable 4996 include include include incl...
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...