您的位置:首页 > 其它

zoj 3471(状态压缩)

2014-03-09 18:39 447 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257

dp[state]表示当前状态为state时的所能获得的最大值,这里我用1表示气球存在,0表示消失,由于状态转移是从有到无,于是最外层循环于是从大到小,这与一般的状态要所略有区别。

方程为:dp[s ^ (1 << j)] = max(dp[s ^ (1 << j)], dp[s] + map[i][j])(i撞击j之后j消失);

/*************************************************************************
> File Name: zoj3471.cpp
> Author: syhjh
> Created Time: 2014年03月09日 星期日 18时19分25秒
************************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int dp[1 << 12];
int map[12][12];
int N;

int main()
{
while (cin >> N && N != 0) {
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
cin >> map[i][j];
memset(dp, 0, sizeof(dp));
for (int s = (1 << N) - 1; s >= 0; s--) {
for (int i = 0; i < N; i++) if (s & (1 << i)) {
for (int j = 0; j < N; j++) if (i != j && (s & (1 << j))) {
dp[s ^ (1 << j)] = max(dp[s ^ (1 << j)], dp[s] + map[i][j]);
}
}
}
int ans = 0;
for (int s = 0; s < (1 << N); s++) {
ans = max(ans, dp[s]);
}
cout << ans << endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: