//poj 1038
#include <iostream>
using namespace std;
int n,m,k,x,y,ans,o;
int map[180][16],f[2][60000],three[16],p[16],q[16];
void init()
{
three[0]=1;
for(int i=1;i<=11;++i)
three[i]=three[i-1]*3;
}
int update(int *p,int *q,int i,int j)
{
int cnt=0,res=0;
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
for(int k=1;k<=m;++k){
p[k]=j%3;
j/=3;
}
for(int k=0;k<m;++k){
if(map[i][k+1]) q[k+1]=2,res+=2*three[k];
else if(p[k+1]==2) q[k+1]=1,res+=three[k];
else q[k+1]=0;
}
return res;
}
void dfs(int now,int y,int r)
{
ans=max(ans,now);
if(y+1<=m&&p[y]==0&&p[y+1]==0&&q[y]==0&&q[y+1]==0){
int i=r+three[y-1]*2+three[y]*2;
f[o][i]=max(f[o][i],now+1);
dfs(now+1,y+2,i);
}
if(y+2<=m&&q[y]==0&&q[y+1]==0&&q[y+2]==0){
int i=r+three[y-1]*2+three[y]*2+three[y+1]*2;
f[o][i]=max(f[o][i],now+1);
dfs(now+1,y+3,i);
}
f[o][r]=max(f[o][r],now);
if(y+1<=m) dfs(now,y+1,r);
}
int main()
{
int cases;
init();
scanf("%d",&cases);
while(cases--){
scanf("%d%d%d",&n,&m,&k);
memset(map,0,sizeof(map));
while(k--){
scanf("%d%d",&x,&y);
map[x][y]=1;
}
x=0;
for(int i=1;i<=m;++i)
if(map[1][i]) x+=2*three[i-1];
else x+=three[i-1];
o=0;
memset(f,-1,sizeof(f));
f[o][x]=0;
ans=0;
for(int i=2;i<=n;++i){
o=1-o;
memset(f[o],-1,sizeof(f[o]));
for(int j=0;j<three[m];++j)
if(f[1-o][j]!=-1){
int r=update(p,q,i,j);
dfs(f[1-o][j],1,r);
}
}
printf("%d\n",ans);
}
return 0;
}
poj 1038 Bugs Integrated, Inc. 状态压缩dp
最新推荐文章于 2020-06-12 13:14:17 发布