您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: