hdu1565 dp狀態壓縮

2021-06-27 01:06:00 字數 452 閱讀 1987

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

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

解題思路:先找出所有能成立的狀態,即(i&(i<<1))==0,表示每一行都沒有相鄰的,然後遍歷if((q[j]&(1《再進行動態更新,用上一行的狀態加上這一行的狀態,找出最大的和,只要q[j]&q[k])==0(j表示當前行,k表示上一行)只要成立就滿足要求。

#include#include#includeusing namespace std;

int dp[21][20000],q[20000],map[21][21];

int main(){

int n;

while(scanf("%d",&n)!=eof){

int crt=0;

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

hdu 1565 狀態壓縮DP

這題可以用最大流做,為了練dp就用狀態壓縮了。我一開始只想到乙個o n 2 n 2 n 的方法,效率太低,看了某大牛的解題報告後,才將演算法優化到o n 2 2 n 不過就這樣還wa了好幾次,原因是 中一句 if k t 0 我開始寫成了if k t 0 沒有注意到位運算子的優先順序是低於邏輯運算子...

hdu1565 網路流或狀態壓縮DP

對於網路流有乙個定理 最小點權覆蓋集 最大網路流 最大點權獨立集 總權值 最小點權覆蓋集 網路流解法 如下 include include include include define n 1010 define m 50010 define inf 1 30 using namespace std...

hdu 1565 方格取數 1 狀態壓縮 dp

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