题目链接点击打开链接
#include<stdio.h>
#include<string.h>
int dp[1100];//记录状态用二进制数表示状态
int n,map[15][15];
int Max(int a,int b){return a>b?a:b;}
void init()
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
memset(dp,-1,sizeof(dp));
}
int dfs(int x)
{
if(dp[x]!=-1)return dp[x];
int temp=0;
int max=0;
int s;
int j,i;
for(i=0;i<n;i++)
{
max=0;
if((1<<i)&x)//枚举当前状态可以合并的石头
{
s=x-(1<<i);//该石头被合并后的新状态
if(s==0)return dp[x]=0;
for(j=0;j<n;j++)
if(s&(1<<j))//枚举剩余的石头与当前的石头合并得到的金币的最大值
max=Max(max,map[j][i]);//石头i消失时得到的最大金币数
temp=Max(temp,(dfs(s)+max));//记录当前状态的最优解
}
}
return dp[x]=temp;
}
int solve()
{
return dfs((1<<n)-1);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
int ans=solve();
printf("%d\n",ans);
}
}