木块砌墙题目:
用三种木块,搭建k×2n×1的墙,不能翻转、旋转木块(0≤ n≤ 1024 ,1 ≤ k ≤ 5),计算有多少种方案,输出结果对1000000007取模。
图1 木块与墙
该题目是在庞果网(http://hero.pongo.cn/)第一次看到,但是由于该网站的特殊之处,现在看不到了,不过可以在这看到http://tieba.baidu.com/p/2351476089。
在解题之前,首先感谢庞果网的热心网友们的激情讨论,才让我的思路渐渐清晰成熟起来。
- 分析
看到n可以取值1024,即21024,这是一个很庞大的数字,一般不会也不可能计算出该数据再做处理,正常的思路是要想办法减低问题规模,并找出大规模问题与小规模问题之间的关系。该题目可以采用动态规划算法,将原问题递归划分为子问题,依据边界条件计算出子问题的解,然后根据子问题的状态及子问题之间的状态转移关系组合出原问题解。
墙与木块的厚度都为1,则可以只考虑宽度和高度(k×2n),进一步降低思考的难度。假设该问题结果用F(n,k)表示,由题目可知墙的宽度随着n增加1而增加一倍,所以降低n则可以快速降低问题规模。若能够找出最优子结构满足F(n,k) = g(F(n-1,k)); g()为子问题根据状态即状态转移关系合并子问题的策略。