求把
例如当
如下图所示:
输入包含多组测试用例。
每组测试用例占一行,包含两个整数
当输入用例
每个测试用例输出一个结果,每个结果占一行。
1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0
1
0
1
2
3
5
144
51205
前置题目:0338
前置知识:简单数论
本题知识:动态规划-状态压缩DP
八字箴言:化零为整,化整为零(即状态表示,状态计算)
长方形的摆法有两种,横着摆和竖着摆,所有长方形合在一起还原整个棋盘 所以可以先只横着摆,然后校验剩余的地方是否可以合法竖着摆
如图所示,是一种前 i - 1 列摆好,第 i - 1列伸出到第 i 列的状态是 110001 的方案,设为 f[i, 110001] 这种方案的值又是由前 i - 2 列摆好,第 i -2 列伸出到第 i - 1列的各种合法状态的数量之和
那么怎么样的状态是合法的呢?
- 两种状态不能冲突
- 空下的方格可以完美的竖着摆放
初始化 f[0, 0] = 1,前 -1 列已经摆好,且 -1 列伸出到 0列的状态是 000000,这种方案只有 1 种:空棋盘。 最终答案 f[m, 0],棋盘列数是 0 ~ m - 1,所以 f[m, 0] 根据定义就是刚好将棋盘摆满
时间复杂度 = 状态数量 x 转移计算量 = 11*2^11 x 2^11 ≈ 4*10^7
预处理:
- 将如图 i - 1 列的所有合法情况事先计算出来
- 在任何一种给定的 i - 1到 i 的状态下,从第 i - 2 到第 i - 1 的合法状态事先计算出来