基础的状态压缩题目,刚学状态压缩,看了一大半PPt果断先刷个题的说,每一行的状态与前两行有关,直接开思四维空间,同时用滚动数组优化空间,由于本人小小的失误,其中两个下标i,j写反了,而且很坑爹的还通过测试数据了,调了一晚上才给揪出来。。。还有比这更悲剧的吗?
ACcode:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long LL;
int const W=8;
int const LIM=1<<W;
int const NS=40000;
int state[NS][3],num[LIM],top;
LL dp[2][1<<W][1<<W][11];
int getone(int x)
{
int cnt=0;
for (;x;cnt++,x&=x-1);
return cnt;
}
int pos1(int x,int y)
{
return ((x<<1)|(x>>1))&y;
}
int pos2(int x,int y)
{
return ((x<<2)|(x>>2))&y;
}
void init(int x)
{
for (int i=0;i<LIM;i++)
for (int j=0;j<LIM;j++)
for (int k=0;k<=10;k++)
dp[x][i][j][k]=0;
}
void prepare()
{
top=0;
for (int i=0;i<LIM;i++)
num[i]=getone(i);
for (int i=0;i<LIM;i++)
for (int j=0;j<LIM;j++)
{
if (pos2(i,j)) continue;
for (int k=0;k<LIM;k++)
{
if (pos1(i,k)) continue;
if (pos2(j,k)) continue;
state[top][0]=i;
state[top][1]=j;
state[top++][2]=k;
}
}
}
int main()
{
prepare();
char ch[W];
int T,n,g[W];
int p,q,r,s,t;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n),init(0);
for (int i=0;i<W;i++)
{
scanf("%s",ch);
for (int j=0;j<W;j++)
if (ch[j]=='*')
{
g[i]=(1<<j);
break;
}
}
LL res=0;
int now=0,pre=1;
for (int i=0;i<LIM;i++)
{
if (i&g[0]) continue;
for (int j=0;j<LIM;j++)
{
if (j&g[1]) continue;
if (pos2(i,j)) continue;
dp[0][j][i][num[i]+num[j]]=1;
}
}
for (int i=2;i<W;i++)
{
now^=1,pre^=1,init(now);
for (int j=0;j<top;j++)
{
if (state[j][2]&g[i]) continue;
p=state[j][0],q=state[j][1];
r=state[j][2],t=num[state[j][2]];
for (int k=num[p]+num[q];k<=(n-t);k++)
dp[now][r][q][t+k]+=dp[pre][q][p][k];
}
}
for (int i=0;i<LIM;i++)
for (int j=0;j<LIM;j++)
res+=dp[now][i][j][n];
printf("%I64d\n",res);
}
return 0;
}