您的位置:首页 > 其它

ZOJ 3471 状压DP

2017-04-19 20:26 302 查看

题意

N个元素,一个元素可以碰撞另一个元素产生能量,碰撞的结果是这个元素消失。问最大能产生多少能量?

题解

最基础的状压DP,因为只有10个元素,因此可以将所有状态枚举出来。状态转移方程dp[k]=max(dp[k],dp[s]+a[i][j])

代码

#include <iostream>
#include<cstring>
#include<cstdio>

using namespace std;
int a[15][15];
int dp[1050];

int main()
{
int n;
while(~scanf("%d",&n)){
if(n==0)
break;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
int mx=1<<n;
for(int k=0;k<mx;k++){
for(int i=0;i<n;i++){
if(k&1<<i)
continue;
for(int j=0;j<n;j++){
if(i==j)
continue;
if(!(k&1<<j))
continue;
int st=k^1<<j;
dp[k]=max(dp[k],dp[st]+a[i][j]);
}
}
}
int ans=0;
for(int i=0;i<mx;i++){
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: