博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
广场铺砖问题(状态压缩dp,贴砖)
阅读量:5326 次
发布时间:2019-06-14

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

题目大意:有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法?

(w,h<=11)

Solution:

状态压缩DP。

爆搜肯定是不行的,由于每个点有2种状态(放,不放),那随随便便搜索树上的节点就超过2^121了,GG。

我们考虑按行铺,每行的状态多可以表示为一个01串,每行的状态s都是通过前一行的状态s'转移来的,用dp[i][state]来表示第i行状态为state的方案数,因此我们考虑用dfs来实现会方便很多。

如图所示

尝试再分析一下问题的性质,对于i行j列

如果前一行该位置为0,那么该位置可以竖放 即 0-> 1
如果前一行连续两个位置为0,那么这两个连续位置可以横放 即00-> 11
如果前一行该位置为1,显然该位置不能再放,于是应该把该位置设置为0 ,即1-> 0

对于一个当前行的可行状态s,用dfs构造不和它矛盾的下一行的状态,将方案累加到下一行。 所以每遇到一个可行状态,都要进行一遍dfs。

#include
using namespace std;int w,h;long long s,dp[13][15000]; //第i行 状态为j inline void dfs(int i,int state,int next,int c)//i行 i行的状态 下一行的状态 c-1列 { if(c==h) { dp[i+1][next]+=dp[i][state]; return; } if((state&(1<
>w>>h; if(w*h%2==1) cout<<"-1"; s=(1<

转载于:https://www.cnblogs.com/Patrickpwq/articles/9399832.html

你可能感兴趣的文章
Spring.Net学习笔记(5)-集合注入
查看>>
[zz]EI/SCI 检索信息
查看>>
java进阶的书籍
查看>>
11算法策略之动态规划
查看>>
window安装elasticsearch和kibana
查看>>
局部变量与全局变量
查看>>
LoadRunner对移动互联网后端服务器压力测试
查看>>
hibernate 的POJO状态
查看>>
ORM
查看>>
大话数据结构 -07-2 图的遍历
查看>>
HDU3729--I'm Telling the Truth
查看>>
使用handler时的warning:This Handler class should be static or leaks might occur
查看>>
简单截图功能实现
查看>>
spring
查看>>
ssh三大框架,三层架构 整合测试!完整分页代码,JdbcTemplate等测试,存储过程调用,留着以后复习吧...
查看>>
Haskell 笔记(四)函数系统
查看>>
[置顶] 安卓UI组件之ListView详解
查看>>
测试项目测试计划
查看>>
控件事件android中自定义控件
查看>>
我的目标在哪里——一个程序员的规划
查看>>