题目链接
题解动态规划。
对于每一种摆放的方式,如果我们将横向(1×2)的小矩形合理地摆放在棋盘中,那么纵向(2×1)的小矩形的摆放方式也就固定了。也就是说,我们只要确定了横向小矩形摆放的位置,只要将剩下位置填上纵向小矩形即可。因此,问题转化为了如何对横向小矩形进行合理地摆放。
定义状态表示:dp[i][j]
表示棋盘的第i
列的状态为j
的方案数。 细细说来,规定横向小矩形的左侧小方格的位置能够代表整个小矩形的位置,举例说明一下,如果说在(1,2)放置了横向小矩形,则该矩形其实覆盖了(1,2)和(1,3)两个方格。 状态表示中的“状态j
”是一个二进制表示,1
表示该列的此位置(某一行)放置了横向小矩形,0
表示未放置横向小矩形。(无论是将10010
的最左侧的1
理解为第一行,还是将最右侧的0
理解为第一行都无所谓,对结果没有影响) 举例: 上面的状态对应的就是
dp[1][(1001)]
,而对于第二列,我们并没有放置小矩形,也就是说其实还没遍历到第二列。 上面的状态不仅有
dp[1][(1001)]
,还有dp[2][(0100)]
。(不保证合理性,所以也就没法对dp进行赋值,只是单纯讲解dp数组的含义)
对于第i
列的某一个状态j
需要满足两个条件: ① 若第i-1
列的状态为k
,则由于不能出现横向小矩形覆盖的情况,所以如果第i-1
列在第s
行放置了小矩形,则第i
列就不允许在第s
行放置小矩形了,转换为代码:要保证k&j
等于0。 ② 考虑到放完横向小矩形后还要放置纵向小矩形,所以必须保证每一列纵向连续的空格子数为偶数个(因为纵向小矩形的高度为2,连续空格子数必须为2的倍数)。对于这种情况,我们可以提前预处理,对于全部的情况j
(0 ~ 1
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?