思路:狀態壓縮dp,設dp[i][j] 表示前i行,狀態為j時的最大值,狀態定義為:若前i行中取了第x列那麼j的二進位制位中第x位為1,否則為0,最後答案就是dp[n-1][(1 << n)-1];
裝態轉移方程就是 dp[i][j|(1 << k)] = max(dp[i][j|(1 << k)],dp[i-1][j] + mat[i][k]) (j & (1 << k) == 0)
#include#include#include#include#includeusing namespace std;
const int maxn = 16;
int dp[maxn][1 << maxn], mat[maxn][maxn];
int main()
int len = (1 << n);
memset(dp, 0, sizeof dp);
for(int i = 0;i < n; i ++) dp[0][1 << i] = mat[0][i];
for(int i = 1;i < n;i ++)}}
printf("case %d: %d\n", ++case, dp[n-1][len-1]);
}return 0;
}
;
lightoj 1018 (狀態壓縮DP)
設dp s 表示狀態s下所需要的線段的個數,s的二進位制中第x位為1就表示該狀態下第x個點沒被線段覆蓋。需要預處理出來在任意兩點之間連線所覆蓋點的狀態o n 3 然後記憶化搜尋即可。include include include include includeusing namespace std ...
lightoj 1158 狀態壓縮 數字DP
題意 給定乙個數,求有多少種變換是該數對d取余為0 思路 很明顯的數字dp,又因為這題每一位的數的個數是受限制的,所以在轉移的過程中要記錄數的使用情況,而給定的數最多為10位,所以可以用狀態壓縮 dp statu premod 表示已經使用statu中的位置的數,且之前的余為premod的個數 ac...
light 1011 狀態壓縮dp
題意 給乙個n n的二維陣列,從中選出n個數 要求不能同行同列,求這n個數最大數的和 狀態壓縮。每個i 1由上乙個i推出來,這個直接乙個for 搞一下就可以,剩下的就是列舉每個列。開乙個dp 1 16 二進位制1表示我不在這一列中選取,0表示在這一列選取了數字。1 異或表示去掉乙個1,比如1000 ...