/*
用0表示沒選這個數,用1表示沒選
那麼n<=20那麼每一列的情況就可以用二進位制數表示
前一列能到後一列的狀態的條件是前面一列的二進位制狀態和後一列的二進位制狀態『與』為0
而對於這些二進位制狀態所表示的數必須滿足沒有相鄰的1,從而保證每一行滿足條件
*/#include
#include
#include
using namespace std;
#define maxn 30
#define maxs 1<<20
#define inf 0x7ffffff
int dp[maxs][maxn];//dp[i][j]第i個滿足條件的二進位制狀態在第j列的最大值
int useful[maxs];//記錄滿足條件的二進位制數
int chess[maxn][maxn];
int n;
int judge(int i)//判斷這個數是否滿足條件
return 1;
}return ans;
}int init()
//存下所有滿足條件的二進位制狀態
for(i=0;idp[i][0]=count(useful[i],0);
return k;
}int main()
int ans=-inf;
for(i=0;ians=max(ans,dp[i][n-1]);
printf("%d\n",ans);
}return 0;
}
HDU 1565 方格取數 1 (狀壓DP)
problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...
HDU 1565 方格取數 1 狀壓DP
description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 output 對於每...
HDU 1565 方格取數 1 狀壓dp
解題思路 dp i j 代表到第i行的第j個狀態所能得到的最大的和,可以先處理一行沒有兩個相鄰的滿足條件的狀態。然後把每行每個狀態的和都算出來,狀態轉移的條件是當前這行第j個狀態與上一行的第k個狀態想與為0,即沒有相鄰的,那就能更新dp i j dp i j max dp i j dp i 1 k ...