【题目大意】不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量。
【题目解析】用10位二进制表示气体是否存在,0表示存在,1表示不存在,S(上一个状态)中的两种气体碰撞并且有一种消失,可以得到newS的状态(状态转移)
【状态表示】dp[state] 状态为state时的最大能量
【转移方程】dp[state] = max(dp[state],dp[state']+a[i][j])
【边界条件】dp[i] = 0;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define inf 0x7fffffff
int state[2000];
int dis[12][12];
int dp[2000];
int max(int a,int b)
{
return a > b ? a : b;
}
int main()
{
int n,i,j,B;
while(scanf("%d",&n) && n)
{
for(i = 1;i <= n;i ++)
for(j = 1;j <= n;j ++)
cin >> dis[i][j];
memset(dp,0,sizeof(dp));
dp[0] = 0;//0表示没有破 1表示相应的气球破了
for(B = 1;B < 1 << n;B ++)
{
for(i = 1;i <= n;i ++)
if(B & 1 << (i - 1))//表示第i个气球破了
{
//cout << B << endl;
for(j = 1;j <= n;j ++)
{
if((B & 1 << (j - 1)) == 0)//表示第j位气球没有破,可以有其相应的转化
{
// cout << dp[B] << " " << dp[B ^ 1<<(i - 1)] + dis[j][i] << endl;
dp[B] = max(dp[B],dp[B ^ 1<<(i - 1)] + dis[j][i]);
}
}
}
//cout << B << " "<< dp[B] << endl;
}
int ans = -1;
for(i = 0;i < 1 << n;i ++)
ans = max(ans,dp[i]);
cout << ans << endl;
}
return 0;
}