题意:
给你一个n*n的矩阵,每个位置有一个非负数,在矩阵中取数字,要求,取的数字,不能相邻。。
用网络流做的话0ms.
#include"stdio.h"
#include"string.h"
#define N 21
int state[1<<15];
int top,n,map[N][N];
int dp[2][1<<15];
int t[N][1<<15];
int ok(int x)
{
if(x&(x<<1))return 0;
return 1;
}
void init()
{
int i,j,k;
top=0;
for(i=0;i<(1<<n);i++)
if(ok(i))state[top++]=i;
memset(t,0,sizeof(t));
for(i=0;i<n;i++)
{
for(j=0;j<top;j++)
{
t[i][j]=0;
int sum=0;
for(k=0;k<n;k++)
{
if(state[j]&(1<<k))sum+=map[i][k];
}
t[i][j]=sum;
}
}
}
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
int i,j,k;
while(scanf("%d",&n)!=-1)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
scanf("%d",&map[i][j]);
}
init();
int ans=0;
for(i=0;i<top;i++)
{
dp[0][i]=t[0][i];
if(ans<dp[0][i])ans=dp[0][i];
}
for(i=1;i<n;i++)
{
for(j=0;j<top;j++)
{
dp[i%2][j]=0;
for(k=0;k<top;k++)
{
if(state[j]&state[k])continue;
dp[i%2][j]=max(dp[(i+1)%2][k]+t[i][j],dp[i%2][j]);
}
if(dp[i%2][j]>ans)ans=dp[i%2][j];
}
}
printf("%d\n",ans);
}
return 0;
}