终于可以写题解了。因为一个细节上的失误,让我重新修改的代码一直通不过测试,郁闷。
代码毫无参考价值,刚学的状态压缩DP,代码写得很难看。
#include<stdio.h>
#include<string.h>
#define N 21
int dp[1<<N],flag[N],mark[N][N],t[1<<N];
int n,st[1<<N],ss;
int Max(int x,int y)
{
if(x>y)
return x;
return y;
}
void Init()
{
int i,j,k;
k=1<<n;
j=1;
st[0]=0;
for(i=0; i<k; i++)
{
if(!(i&(i<<1)))
st[j++]=i;
}
ss=j;
return ;
}
void Input()
{
int i,j;
for(i=1; i<=n; i++)
{
flag[i]=(1<<n)-1;
for(j=1; j<=n; j++)
scanf("%d",&mark[i][j]);
}
return ;
}
int judge(int x,int y)
{
if((x&flag[y])!=x)
return 1;
return 0;
}
void Output()
{
int i,j,k;
memset(dp,0,sizeof(dp));
memset(t,0,sizeof(t));
for(i=1; i<=n; i++)
{
for(j=0; j<ss; j++)
{
if(judge(st[j],i))
continue;
int temp=0;
for(k=1; k<=n; k++)
{
int ttt=st[j]>>(n-k);
if(ttt&1)
temp+=mark[i][k];
}
for(k=0; k<ss; k++)
{
if((st[k]&st[j])==0)
dp[st[j]]=Max(dp[st[j]],t[st[k]]+temp);
}
}
for(j=0; j<ss; j++)
t[st[j]]=dp[st[j]];
}
int max=0;
for(i=0; i<ss; i++)
max=Max(max,dp[st[i]]);
printf("%d\n",max);
return ;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
{
printf("0\n");
continue;
}
Init();
Input();
Output();
}
return 0;
}