POJ 1565(DP状态压缩)
2013-07-23 21:08
260 查看
#include <iostream> #include <cstdio> using namespace std; int dp[2][1<<20], st[1<<20], map[20][20]; int main() { int i, j, k, n, h, state, tmax; //用二进制标记状态(如:5(101)则符合要求) for(i = state = 0; i < (1<<20); ++i) if((i & (i<<1)) == 0) st[state++] = i; while(scanf("%d", &n) != EOF){ for(i = 0; i < n; ++i) for(j = 0; j < n; ++j) scanf("%d", &map[i][j]); for(i = 0; i < (1<<n); ++i) dp[1][i] = 0; for(k = 0; k < n; ++k){ //k行 h = k & 1; for(i = 0; i < state; ++i){ //一共(1<<n)个状态 if(st[i] >= (1<<n)) break; int sum = 0; for(j = 0; j < n; ++j) if(st[i] & (1<<j)) sum += map[k][j]; //每行每个状态的和 tmax = 0; for(j = 0; j < state; ++j){ if(st[j] >= (1<<n)) break; if(!(st[i] & st[j])) //上一行与本行匹配的最大值 tmax = max(tmax, dp[1-h][st[j]]); } dp[h][st[i]] = tmax + sum; //每行每个状态的最优解(本行+与上一行匹配的最大值) } } tmax = 0; h = (n-1) & 1; for(i = 0; i < (1<<n); ++i) tmax = max(tmax, dp[h][i]); //得到最优解 printf("%d\n", tmax); } return 0; }
相关文章推荐
- POJ 1739 Tony's Tour, 连通性状态压缩DP
- poj 3254 状态压缩DP
- POJ_2411_Mondriaan's Dream_状态压缩dp
- poj 2688 状态压缩dp解tsp
- POJ1185+状态压缩DP
- poj 1185 炮兵阵地 //状态压缩DP
- POJ 3254 Corn Fields(状态压缩) DP入门
- poj 1185 炮兵阵地 状态压缩+dp sum dp,s,Map
- poj 2923 状态压缩dp
- poj 2411 Mondriaan's Dream(状态压缩dp)
- POJ 3254 Corn Fields(状态压缩DP)
- poj2430 状态压缩DP
- POJ 2686 Traveling by Stagecoach(状态压缩dp)
- poj1185炮兵阵地(状态压缩DP)
- POJ 2923 Relocation(状态压缩DP)
- POJ 1185 状态压缩DP
- POJ 2411 状态压缩DP
- POJ 1691 Painting a Board(状态压缩DP)
- poj 1185 炮兵阵地 状态压缩DP
- 【状态压缩DP】POJ 1185