将初始状态设置为1111111......,选择两点,如果都还存在,使两点碰撞,接下来就是记忆化了
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define maxn 10
int map[maxn][maxn];
int dp[1<<10];
int n;
int count(int x)
{
int sum=0;
for(int i=0;i<n;i++)
{
if(x&(1<<i)) sum++;
}
return sum;
}
int dfs(int prev)
{
if(dp[prev]!=-1) return dp[prev];
int ans=0;
for(int i=0;i<n;i++)
{
if(prev&(1<<i))
for(int j=0;j<n;j++)
{
if(i==j) continue;
if(prev&(1<<j))
ans=max(ans,dfs(prev^(1<<j))+map[i][j]);
}
}
return dp[prev]=ans;
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
memset(dp,-1,sizeof(dp));
if(n==0) break;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
}
}
int t=dfs((1<<n)-1);
printf("%d\n",t);
}
return 0;
}