首页 > 其他 > 详细

zoj 3471(状态压缩)

时间:2014-03-10 15:43:20      阅读:456      评论:0      收藏:0      [点我收藏+]

题目链接: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消失);

bubuko.com,布布扣
 1 /*************************************************************************
 2     > File Name: zoj3471.cpp
 3     > Author: syhjh
 4     > Created Time: 2014年03月09日 星期日 18时19分25秒
 5  ************************************************************************/
 6 #include <iostream>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <algorithm>
10 using namespace std;
11 
12 int dp[1 << 12];
13 int map[12][12];
14 int N;
15 
16 int main()
17 {
18     while (cin >> N && N != 0) {
19         for (int i = 0; i < N; i++)
20             for (int j = 0; j < N; j++)
21                 cin >> map[i][j];
22         memset(dp, 0, sizeof(dp));
23         for (int s = (1 << N) - 1; s >= 0; s--) {
24             for (int i = 0; i < N; i++) if (s & (1 << i)) {
25                 for (int j = 0; j < N; j++) if (i != j && (s & (1 << j))) {
26                     dp[s ^ (1 << j)] = max(dp[s ^ (1 << j)], dp[s] + map[i][j]);
27                 }
28             }
29         }
30         int ans = 0;
31         for (int s = 0; s < (1 << N); s++) {
32             ans = max(ans, dp[s]);
33         }
34         cout << ans << endl;
35     }
36     return 0;
37 }
View Code

zoj 3471(状态压缩),布布扣,bubuko.com

zoj 3471(状态压缩)

原文:http://www.cnblogs.com/wally/p/3590383.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!