做过hdu1565,这题写起来就很简单了,先把状态dfs出来,再把图预处理好,然后直接两层循环搞定。
ACcode:
#include<cstdio>
#include<cstring>
int const NS=15;
int const INF=1<<30;
int n,lim,top,res;
int g[NS][NS],dp[2][1<<NS];
int state[1<<NS][2],num[NS][1<<NS];
char str[100];
void dfs(int pos,int s1,int s2)
{
if (pos==n)
{
state[top][0]=s1;
state[top++][1]=s2;
return ;
}
dfs(pos+1,s1<<1,s2<<1);
if ((s1&1)==0&&(s2&1)==0)
dfs(pos+1,s1<<1|1,s2<<1),
dfs(pos+1,s1<<1,s2<<1|1);
}
void Init(int f)
{
for (int i=0;i<lim;i++)
dp[f][i]=0;
}
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int p,q,t,now,pre;
while (gets(str))
{
t=strlen(str);
if (t==0) continue;
n=(t+1)/3,top=0;
lim=1<<n,dfs(0,0,0);
for (int i=0;i<t;i+=3)
g[0][i/3]=(str[i]-'0')*10+str[i+1]-'0';
for (int i=1;i<n;i++)
for (int j=0;j<n;j++)
scanf("%d",&g[i][j]);
for (int j,k,i=0;i<top;i++)
for (t=state[i][1],j=0;j<n;j++)
for (num[j][t]=k=0;k<n;k++)
if ((1<<k)&t) num[j][t]+=g[j][k];
res=now=0,pre=1,Init(now);
for (int i=0;i<n;i++)
{
now^=1,pre^=1,Init(now);
for (int j=0;j<top;j++)
p=state[j][0],q=state[j][1],
dp[now][q]=Max(dp[now][q],dp[pre][p]+num[i][p]);
}
for (int i=0;i<lim;i++)
res=Max(res,dp[now][state[i][1]]);
printf("%d\n",res);
}
return 0;
}