博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2411 Mondriaan's Dream(状态压缩dp)
阅读量:4073 次
发布时间:2019-05-25

本文共 818 字,大约阅读时间需要 2 分钟。

题目大意:

有1*2和2*1两种骨牌, 问铺满m*n大小的矩形内可以有多少种铺法?

思路:

用二进制表示,连续两个00表示这两个格子是横放的, 用1表示这个格子是竖放的(是骨牌的上部分或者下部分)。

先处理得到所有符合条件的状态,即如果有0一定是要连续出现两个0.

对于第i行的状态j,j是1的地方,那么i-1行相同地方一定也要是1,0的地方是1或0都可以。 i行和i-1行都是1的地方,他们组成了一个竖放的骨牌,那么i-2行的这些地方,既可以是0也可以是1,所以递归时要把1变成0,这样的话i-2行的这个地方就可以是1或0.

用f[i][j] 表示第i行的j状态有多少种状态。

 

#include
#include
#include
#include
#include
#include
using namespace std;typedef long long int64;const int INF = 0x3f3f3f3f;const int MAX_STATE = (1<<11)+10;const int MAXN = 12;int n, m;int sta[MAX_STATE], idx;int64 f[MAXN][MAX_STATE];int maxState;bool ok[MAX_STATE];bool check(int sta){ int i=0; while(i < m){ if((sta>>i)&1) ++i; else{ if(i==m-1 || ((sta>>(i+1))&1)!=0) return false; i += 2; } } return true;}void init(){ memset(ok, 0, sizeof(ok)); maxState = (1<

转载地址:http://ivzni.baihongyu.com/

你可能感兴趣的文章
Tensorflow入门资料
查看>>
剑指_用两个栈实现队列
查看>>
剑指_顺时针打印矩阵
查看>>
剑指_栈的压入弹出序列
查看>>
剑指_复杂链表的复制
查看>>
服务器普通用户(非管理员账户)在自己目录下安装TensorFlow
查看>>
星环后台研发实习面经
查看>>
大数相乘不能用自带大数类型
查看>>
字节跳动后端开发一面
查看>>
CentOS Tensorflow 基础环境配置
查看>>
centOS7安装FTP
查看>>
FTP的命令
查看>>
CentOS操作系统下安装yum的方法
查看>>
ping 报name or service not known
查看>>
FTP 常见问题
查看>>
zookeeper单机集群安装
查看>>
do_generic_file_read()函数
查看>>
Python学习笔记之数据类型
查看>>
Python学习笔记之特点
查看>>
shell 快捷键
查看>>