ZOJ 4257--Most Powerful(状压dp)

来源:互联网 发布:沈天津seo诊断 编辑:程序博客网 时间:2024/06/07 00:55

来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257

题意:不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量。

分析:用10位的二进制中的0、1表示气体是否存在,dp[i]表示i状态时的最大能量。

#include<iostream>#include<algorithm>#include<iomanip>#include<cstring>#include<string>#include<cstdio>#include<cmath>#include<queue>#include<map>#include<set>using namespace std;int a[11][11];int dp[1<<11];int n;int main(){    while(cin>>n,n)    {        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                cin>>a[i][j];            }        }        memset(dp,0,sizeof(dp));        for(int i=0;i<(1<<n);i++)        {            for(int j=0;j<n;j++)            {                if((i&(1<<j)))                    continue;                for(int k=0;k<n;k++)                {                    if(j==k)                        continue;                    if((i&(1<<k)))                        continue;                    int st=i|(1<<k);                    dp[st]=max(dp[st],dp[i]+a[j][k]);                    //cout<<dp[st]<<endl;                }            }        }        int ans=0;        for(int i=0;i<(1<<n);i++)            ans=max(ans,dp[i]);        cout<<ans<<endl;    }return 0;}


 

原创粉丝点击