数据处理起来很恶心。感觉加这个用字符串输入没什么必要,除了让人容易把题目理解错。。。。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 16
int dp[N][1<<N],flag[N],st[1<<N],a[505],mark[N][N];
int ss,tt;
char t[N],s[N][N*5];
int Max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int change(char *s,int k)
{
int ans;
if(k==1)
ans=s[0]-'0';
else if(k==2)
ans=(s[0]-'0')*10+(s[1]-'0');
return ans;
}
void fun()
{
int i,j,k,l;
int ln;
k=0;
for(i=1; i<=ss; i++)
{
l=0;
ln=strlen(s[i]);
for(j=0; j<ln; j++)
{
if(s[i][j]!=' ')
t[l++]=s[i][j];
else
{
a[k++]=change(t,l);
l=0;
}
}
a[k++]=change(t,l);
}
tt=(int)sqrt(k);
k=0;
for(i=1; i<=tt; i++)
{
flag[i]=(1<<tt)-1;
for(j=1; j<=tt; j++)
mark[i][j]=a[k++];
}
return ;
}
void Init()
{
int i,j;
int n;
n=1<<tt;
j=1;
st[0]=0;
for(i=0; i<n; i++)
{
if(!(i&(i<<1)))
st[j++]=i;
}
ss=j;
return ;
}
void Output()
{
int i,j,k;
memset(dp,0,sizeof(dp));
for(i=1; i<=tt; i++)
{
for(j=0; j<ss; j++)
{
int temp=0;
for(k=1; k<=tt; k++)
{
int ttt=st[j]>>(tt-k);
if(ttt&1)temp+=mark[i][k];
}
for(k=0; k<ss; k++)
{
if(!(st[j]&st[k])&&!(st[j]&(st[k]<<1))&&!(st[j]&(st[k]>>1)))
dp[i][st[j]]=Max(dp[i][st[j]],dp[i-1][st[k]]+temp);
}
}
}
int max=0;
for(i=0; i<ss; i++)
max=Max(dp[tt][st[i]],max);
printf("%d\n",max);
return ;
}
int main()
{
while(gets(s[1]))
{
int i=2;
while(gets(s[i++]),strcmp(s[i-1],"")!=0);
ss=i-2;
fun();
Init();
Output();
}
return 0;
}