您的位置:首页 > 其它

(状态压缩) Most Powerfull (ZOJ 3471)

2013-12-10 15:25 369 查看
题意:有N(10个或以内)的原子,每个原子撞任意另一个原子会有一个能量值。然后被撞的会消失掉。

   这N个原子有且只有一个。求:最大碰撞能量值。

思路:用一个整数S来表示状态,其二进制的1表示原子还在,0表示已经消失。

   dp[S]存在状态S下的最大能量值。

网址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4257

#include <iostream>
#include<vector>
using namespace std;

int n;
int map[10][10];
int dp[1<<10];

int main()
{
freopen("in","r",stdin);
int i,j,k;
int cur;
while (cin>>n,n)
{
for (i=0;i<n;i++)
for (j=0;j<n;j++)
scanf("%d",&map[i][j]);
int full=(1<<n)-1;
for (i=0;i<=full;i++)
dp[i]=-1;
dp[full]=0;  //原子都在的时候能量值为0
for (i=full;i;--i) if (dp[i]!=-1)   //此处无太大意义
for (j=0;j<n;j++) if (i&(1<<j))    //第j个原子还在
for (k=0;k<n;k++) if (i&(1<<k) && k!=j) //第k个原子还在并不与j相同
{
cur=i^(1<<k);
dp[cur]=max(dp[cur],dp[i]+map[j][k]);
}
int ans=0;
for (i=0;i<n;i++)
ans=max(ans,dp[1<<i]);
cout<<ans<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: