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消失);

zoj 3471(状态压缩)
 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)