呵呵,思路清晰爆了,瞬写
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ch[100];
int map[16][16];
int s[10000],c[16][10000];
int dp[16][10000];
int n;
int count(int h,int x)
{
int i,sum=0;
for(i=0;i<n;i++)
if((x>>i)&1)
sum+=map[h][i];
return sum;
}
int main()
{
while(gets(ch)!=NULL)
{
int len=strlen(ch);
n=len/3+1;
int i,j,k;
int ans=0;
for(i=0;i<len;i+=3)
{
map[0][ans++]=(ch[i]-'0')*10+ch[i+1]-'0';
}
for(i=1;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
gets(ch);
gets(ch);
int tot=(1<<n);
int cnt=0;
for(i=0;i<tot;i++){
if(i&(i>>1)) continue;
s[cnt]=i;
for(j=0;j<n;j++)
c[j][cnt]=count(j,i);
cnt++;
}
memset(dp,-1,sizeof(dp));
for(i=0;i<cnt;i++)
dp[0][i]=c[0][i];
for(i=1;i<n;i++)
{
for(j=0;j<cnt;j++)
{
for(k=0;k<cnt;k++)
{
if((s[k]&(s[j]<<1)) || (s[k]&(s[j]>>1)) || (s[k]&s[j]))
continue;
if(dp[i-1][k]==-1) continue;
dp[i][j]=max(dp[i][j],dp[i-1][k]+c[i][j]);
}
}
}
int mx=0;
for(i=0;i<cnt;i++)
mx=max(mx,dp[n-1][i]);
cout<<mx<<endl;
}
}