跟炮兵阵地的代码差不多,思路完全相同,但是不知道为什么我用滚动数组优化的代码就是通不过。郁闷!
明天起床再好好检查一下。
#include<stdio.h>
#include<string.h>
#define N 11
int mark[105][N],dp[105][200][200],flag[105],st[1<<N],num[1<<N];
int fun(int x)
{
int cnt=0;
while(x)
{
if(x&1) cnt++;
x>>=1;
}
return cnt;
}
int Max(int x,int y)
{
if(x>y)
return x;
return y;
}
int judge(int x,int y)
{
if((x&flag[y])!=x)
return 1;
return 0;
}
int main()
{
int m,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
int i,j,k,l;
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
scanf("%d",&mark[i][j]);
}
memset(flag,0,sizeof(flag));
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
flag[i]=(flag[i]<<1)+mark[i][j];
}
j=0;
for(i=0; i<1<<n; i++)
{
if(!(i&(i<<2)))
st[j++]=i;
}
int ss;
ss=j;
memset(dp,-1,sizeof(dp));
for(i=0; i<ss; i++)
num[i]=fun(st[i]);
for(i=0; i<ss; i++)
{
for(j=0; j<ss; j++)
{
if(!judge(st[i],1))
dp[1][j][i]=num[i];
}
}
for(i=2; i<=m; i++)
{
for(j=0; j<ss; j++)
{
if(judge(st[j],i))
continue;
for(k=0; k<ss; k++)
{
if((st[j]&(st[k]<<1))||(st[j]&(st[k]>>1)))
continue;
for(l=0; l<ss; l++)
{
if(st[l]&st[j])
continue;
if(dp[i-1][l][k]==-1)
continue;
dp[i][k][j]=Max(dp[i][k][j],dp[i-1][l][k]+num[j]);
}
}
}
}
int max=0;
for(i=1; i<=m; i++)
{
for(j=0; j<ss; j++)
for(k=0; k<ss; k++)
max=Max(dp[i][j][k],max);
}
printf("%d\n",max);
}
return 0;
}