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消失);
View Code
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
相关文章推荐
- zoj 3471【二进制压缩状态DP】
- zoj 3471 Most Powerful //状态压缩DP
- ZOJ - 3471 Most Powerful (状态压缩)
- zoj 3471 Most Powerful(状态压缩DP)
- zoj 3471 状态压缩dp
- ZOJ 3471 Most Powerful(状态压缩DP)
- zoj 3471 Most Powerful (状态压缩dp)
- zoj 3471 Most Powerful(状态压缩dp)
- ZOJ 3471 Most Powerful (状态压缩)
- zoj 3471 Most Powerful(状态压缩+dp)
- ZOJ 3471 Most Powerful 【状态压缩DP】
- zoj 3471(状态压缩DP)
- ZOJ 3471 Most Powerful 【状态压缩】
- zoj3471 Most Powerful(状态压缩dp)
- (状态压缩) Most Powerfull (ZOJ 3471)
- ZOJ - 3471 Most Powerful (状态压缩)
- ZOj 3471 Most Powerful 状态压缩DP
- ZOJ 3471 【状态压缩DP】
- zoj 3471 Most Powerful 状态压缩dp
- zoj 3471状态压缩DP