状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可。

然后转移的时候用搜索找出所有的状态进行转移。

#include <map>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define mask(i) ((mask%pow[i+1])/pow[i])
#define a(i) (a[x][i])
int dp[2][500005],pow[20],n,m,k;
int a[205][20],t,now,pre;
void print(int mask)
{F(i,0,m-1)printf("%d",(mask%pow[i+1])/pow[i]);}
void dfs(int x,int y,int mask,int val)
{
// printf("Dfs %d %d %d ",x,y,val); print(mask); printf("\n");getchar();
if (y>=m){dp[pre][mask]=max(val,dp[pre][mask]);return;}
if (y+2<m&&!a(y)&&!a(y+1)&&!a(y+2)&&mask(y)==mask(y+1)&&mask(y+1)==mask(y+2))
{
if (mask(y)==1)
{
// print(mask); printf(" to ");
mask-=pow[y]+pow[y+1]+pow[y+2];
// print(mask); printf("\n");
dfs(x,y+3,mask,val+1);
mask+=pow[y]+pow[y+1]+pow[y+2];
}
else
{
// print(mask); printf(" to ");
mask+=pow[y]+pow[y+1]+pow[y+2];
// print(mask); printf("\n");
dfs(x,y+3,mask,val);
mask-=pow[y]+pow[y+1]+pow[y+2];
}
}
if (y+1<m&&!a(y)&&!a(y+1)&&mask(y)==mask(y+1))
{
if (mask(y)<2)
{
// print(mask); printf(" to ");
mask+=pow[y]+pow[y+1];
// print(mask); printf("\n");
dfs(x,y+2,mask,val);
mask-=pow[y]+pow[y+1];
}
else
{
// print(mask); printf(" to ");
mask-=2*pow[y]+2*pow[y+1];
// print(mask); printf("\n");
dfs(x,y+2,mask,val+1);
mask+=2*pow[y]+2*pow[y+1];
}
}
// printf("%d mask (%d)\n",mask(y),y);
if (!mask(y))
{
dfs(x,y+1,mask,val);
}
}
int main()
{
scanf("%d",&t);
pow[0]=1;
F(i,1,14)pow[i]=pow[i-1]*3;
while (t--)
{
memset(a,0,sizeof a);
scanf("%d%d%d",&n,&m,&k);
F(i,1,k)
{
int x,y;scanf("%d%d",&x,&y);
x--; y--;
a[x][y]=1;
}
F(i,0,m-1) a[n][i]=1;
now=1;pre=0;
memset(dp[pre],-1,sizeof dp[pre]);
dp[pre][0]=0;
F(i,0,n)
{
now^=1; pre^=1;
memset(dp[pre],-1,sizeof dp[pre]); //printf("memset %d\n",pre);
F(j,0,pow[m]-1) if (~dp[now][j])
{
// printf("%d is no ",i); print(j); printf(" == ");printf("%d\n",dp[now][j]);
dfs(i,0,j,dp[now][j]);
}
}
printf("%d\n",dp[pre][0]);
}
}

  

最新文章

  1. centos单用户模式修改ROOT密码
  2. mysql 添加用户并授权
  3. 【测试】通过SYS用户,对SCOTT用户的会话进行跟踪,并分析此会话中性能消耗较高的SQL,分析并给出优化建议。
  4. 通过navicat连接mysql服务器提示SQL Error (1130): Host &#39;192.168.1.100&#39; is not allowed to connect to this MySQL server
  5. 【2013杭州区域赛】部分题解 hdu4770—4780
  6. PB C/S轉B/S ODBC方式連接數據庫
  7. 绿色mysql启动脚本
  8. Android installed app, never used, cannot receiver BroadcastReceiver
  9. Linux学习之系统的构建
  10. [转]Android 导入v7包常见错误,以及项目引用v7包错误解决
  11. 学习smart gwt 的一些好的网站
  12. python 之反射
  13. keras01 - hello world ~ 搭建第一个神经网络
  14. Python2安装igraph
  15. 【转载】Mysql主从复制、和MySQL集群(主主复制)
  16. 流程图 --- BPMN规范简介
  17. zookeeper集群搭建及Leader选举算法源码解析
  18. redis数据淘汰机制
  19. PyQt4布局管理——绝对定位方式
  20. tensorflow-windows下安装,python3.6

热门文章

  1. path与classpath区别(转)
  2. 使用Azure CDN更快速的交付内容
  3. springmvc+maven搭建web项目
  4. Android(java)学习笔记146:网页源码查看器(Handler消息机制)
  5. window10系统安装Ubuntu18.04系统
  6. velocity生成静态页面代码
  7. POI把html写入word doc文件
  8. HTML5拖放(drag和drog)作品
  9. 洛谷 P2846 光开关
  10. CentOS7服务器上部署Oracle客户端