题目链接 : 点击打开链接
枚举出不同状态(1<<n)种下引爆不同炸弹的最大收益。
全排列枚举爆炸顺序,找到最大值。
#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=j;i<=k;i++)
typedef long long ll;
int Map[14][14];
int xx[1028][14];
int Max(int x,int y){
return x>y?x:y;
}
int main(){
int n;
int tmp=1;
while(cin>>n,n){
memset(xx,0,sizeof(xx));
rep(i,0,n-1){
rep(j,0,n-1) scanf("%d",&Map[i][j]);
}
for(int i=0;i<1<<n;i++){
for(int j=0;j<n;j++){
if(((i>>j)%2)==0){
for(int k=0;k<n;k++){
xx[i][k]=Max(xx[i][k],Map[j][k]);
}
}
}
}
int a[11];
long long ans=0;
long long res=0;
for(int i=0;i<n;i++) a[i]=i;
do{
int st=0;
ans=0;
rep(i,0,n-2){
ans+=xx[st][a[i]];
st+=1<<a[i];
}
res=Max(res,ans);
}while(next_permutation(a,a+n));
cout<<res<<endl;
}
return 0;
}