andre_joy

导航

zoj 3471

地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471

题意:n种气体,每两种碰在一起会产生能量,然后后者消失。自己不能跟自己撞。求产生的最大能量。

mark:状态压缩dp。自己写的时候很忐忑,最后看解体报告发现跟自己思路一样,嘿嘿~

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define J1 (k|(1<<j))
#define J2 (k&(1<<j))
#define II (k&(1<<i))

const int M = 1024;
const int N = 0xffffffff;
int dp[M+10];

int max(int a, int b) {return a > b ? a : b;}

int main()
{
    int n,a[15][15];
    int i,j,k;
    while(scanf("%d", &n), n)
    {
        memset(dp, 0, sizeof(dp));
        for(i = 0; i < n; i++)
            for(j = 0; j < n; j++)
                scanf("%d", &a[i][j]);
        for(k = 0; k < (1 << n); k++)
        {
            for(i = 0; i < n; i++)
            {
                if(dp[II]) continue;
                for(j = 0; j < n; j++)
                {
                    if(i == j || dp[J2]) continue;
                    dp[J1] = max(dp[J1], dp[k]+a[i][j]);
                }
            }
        }
        for(i = j = 0; i < n; i++)
            j = max(j, dp[(1 << n)-1-(1 << i)]);
        printf("%d\n", j);
    }
    return 0;
}

posted on 2012-08-03 10:51  andre_joy  阅读(167)  评论(0编辑  收藏  举报