zoj 3471 Most Powerful (状态压缩dp~)

来源:互联网 发布:比较实用的软件 编辑:程序博客网 时间:2024/06/06 20:01

注意这里要求的是最多的能量,没有限制状态,反正只要最多就好了。这就是dp后还需要一个求ans的循环的原因

#include <cstdio>#include <cstring>#include <iostream>#define MAX 20using namespace std;int n;int map[MAX][MAX];int dp[2000];int main(void) {    while (scanf("%d", &n) == 1 && n) {        memset(map, 0, sizeof(map));        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= n; j++) scanf("%d", &map[i][j]);        }        // 0表示存在,1表示不存在        int state = (1 << n) - 1;        memset(dp, 0, sizeof(dp));        for (int s = 0; s < state; s++) {            for (int i = 1; i <= n; i++) {                if (s & (1 << (i - 1)))  //若第i个原子已经不存在了,                                         //则不能进行i到j的转移                    continue;                for (int j = 1; j <= n; j++)  //从i到j的转移                {                    if ((s & (1 << (j - 1))) || j == i) continue;                    if (dp[s | (1 << (j - 1))] < dp[s] + map[i][j])                        dp[s | (1 << (j - 1))] = dp[s] + map[i][j];                }            }        }        int ans = 0;        for (int i = 0; i < state; i++) {            ans = max(ans, dp[i]);        }        printf("%d\n", ans);    }    return 0;}


原创粉丝点击