同类类于poj3311,但是要简单,不用转什么弯子
直接 十种气体 每种是否存在的状态 s,然后 dp[s] = max(dp[s],dp[s - {被碰的气体状态}] + 两气体相碰获得的价值);想起来不难,写起来也算比较简单..
int n;
int dp[1<<12];
int mp[10 + 5][10 + 5];
void init() {
memset(mp,0,sizeof(mp));
memset(dp,0,sizeof(dp));
}
bool input() {
while(cin>>n,n) {
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&mp[i][j]);
return false;
}
return true;
}
void cal() {
int ans = 0;
for(int i=0;i<(1<<n);i++) {
for(int j=0;j<n;j++) {
if(!(i&(1<<j)))continue;
for(int k=0;k<n;k++) {
if(!(i&(1<<k)))continue;
if(j == k)continue;
dp[i] = max(dp[i],dp[i^(1<<j)] + mp[k][j]);
}
}
ans = max(ans,dp[i]);
}
cout<<ans<<endl;
}
void output() {
}
int main () {
while(true) {
init();
if(input())return 0;
cal();
output();
}
return 0;
}