题意
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;
}