AC代码:
#include<stdio.h>
#include<string.h>
#define max(a,b) (((a)>(b))?(a):(b))
int dp[10000],a[12][12],n;
int dj(int x){
int i,j,temp,Mx=0,mx;
if(dp[x]!=-1) return dp[x];
//搜过的状态要标记, 这要注意!! 不写的话会超时
if(x==0) return 0;
for(i=0;i<n;i++){
mx=0;
if(x&(1<<i)){//枚举所有可以合并的石子, 第i+1个
int temp=x-(1<<i);//合并完的状态,
for(j=0;j<n;j++){
if(temp&(1<<j))//枚举所有可以与第i+1个石子合并的石子,
mx=max(a[j+1][i+1],mx);
}
Mx=max(Mx,dj(temp)+mx);
}
}
dp[x]=Mx;
return dp[x];
}
int main(){
int i,j,ans;
while(scanf("%d",&n)!=EOF){
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&a[i][j]);
memset(dp,-1,sizeof(dp));
ans=dj((1<<n)-1);
printf("%d\n",ans);
}
}