zoj 3471(状态压缩)
题目链接: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消失);
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 }