作者: Phill King
邮箱: phillking1982@163.com
原创文章,转载请注明出处。
在之前的文章 铺瓷砖问题(一)中介绍了状态压缩动态规划的方法,但是时间复杂度较高。在此介绍一下轮廓线动态规划算法,可以更快的解决问题。
- 定义状态
依然设行数为N,列数为M.
在前文我们用整行来定义状态,然后对相邻两行的状态进行转移。 在此我们定义以当前格结尾的M个格子为状态的范围。如下图所示:
- 状态转移
这样定义状态虽然数量增多了,但好处是状态转移关系非常的简单,只有三种可能。因此总的复杂度依然可以降低很多。
状态转移的三种情况见下图:
转换1: 上一个状态最高位为1, 当前格可以选择不放。
newState = (State<<1)^(1<<M); // 需要将最高位清零
转换2:上一个状态最高位为0, 必须竖放
newState =