题目大意:有N个原子,下面输入w[N][N]矩阵 i 行 j 列任意两个原子碰撞产生的能量,j消失,求产生的最大的能量
思路:dp[1<<N]表示状态i时的最大能量,dp[i]=dp[i-1<<j]+w[k][j];0<=k<N
这算是一个比较简单状压dp题,只有1维,状态转移方程也很简单,也是在老师给的课件上的原题、
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<queue>
#include<stack>
using namespace std;
int N,a[15][15],dp[1<<12];
int main()
{
int i,j,k,ans;
while(~scanf("%d",&N))
{
memset(dp,0,sizeof(dp));
if(N==0) break;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
scanf("%d",&a[i][j]);
ans=1<<(N+1);
for(i=0;i<ans;i++)
{
for(j=1;j<=N;j++)
{
int s=1<<j;
if(i&s) continue;
for(k=1;k<=N;k++)
{
if((i&1<<k)==0&&k!=j)
dp[i+s]=max(dp[i+s],dp[i]+a[k][j]);
}
}
}
int aa=0;
for(i=0;i<ans;i++)
{
aa=max(aa,dp[i]);}
cout<<aa<<endl;
}
}