zoj 3471Most Powerful

  题意:给n个atom(原子),每两个原子相碰会产生能量,不过每次碰撞会消失一个原子,而且不同原子碰撞,消失的原子不同,产生的能量也会不同,给出不同原子相碰撞产生的能量,求出能产生的最多能量。

  状态DP

  状态s表示n个原子的状态。

  每次碰撞只消失一个原子,最后会剩下一个原子不消失,最终的答案是max(dp[(1<<n-1)^(1<<i)]),i 表示最后剩下的原子。

  状态转移方程是: i 是 s 中消失的原子,j 是没有消失的原子 dp[s]=max(dp[s^(1<<i)]+map[j][i])

#include<stdio.h>
#include<string.h>
#define max(a,b)    (a)>(b)?(a):(b)

int n;
int dp[1<<10],map[12][12];
int DP(int s)
{
    if(dp[s]!=-1)   return dp[s];
    for(int i=0;i<n;i++)
    {
        if(!(s&(1<<i))) continue;
        for(int j=0;j<n;j++)
        {
            if(s&(1<<j))    continue; 
            dp[s]=max(dp[s],DP(s^(1<<i))+map[j][i]);  
        }
    }
    return dp[s];
}
int main()
{
    while(scanf("%d",&n) && n)
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                scanf("%d",&map[i][j]);
        memset(dp,-1,sizeof(dp));
        dp[0]=0;
        int ans=0,all=(1<<n)-1;
        for(int i=0;i<n;i++)
            ans=max(ans,DP(all^(1<<i)));
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2013-08-19 20:29  yongren1zu  阅读(105)  评论(0编辑  收藏  举报