矩形覆盖
2015-11-26 22:14
330 查看
题目描述: 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
分析:
![](https://img-blog.csdn.net/20151126220741956?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如图,设n=3,设我们从最左边开始覆盖,一开始,我们有两种选择,竖着放或者横着放,若横着放第一块后,下一块必然要把4个格子填满。然后图像就分为已经填好的,和还没填好的。可以看到剩下还没填好的,其实是初始问题n的一个子问题。
于是f(n) = f(n-1) + f(n-2),于是这又是一个斐波那契数列问题。
用自底向上动态规划来做。当n为0时,f(0) = 1; 当n为1时,f(1) = 1; 当n为2时,f(2) = 2;
代码如下:
分析:
如图,设n=3,设我们从最左边开始覆盖,一开始,我们有两种选择,竖着放或者横着放,若横着放第一块后,下一块必然要把4个格子填满。然后图像就分为已经填好的,和还没填好的。可以看到剩下还没填好的,其实是初始问题n的一个子问题。
于是f(n) = f(n-1) + f(n-2),于是这又是一个斐波那契数列问题。
用自底向上动态规划来做。当n为0时,f(0) = 1; 当n为1时,f(1) = 1; 当n为2时,f(2) = 2;
代码如下:
//自底向上的动态规划 unsigned long long rectCover(int number) { //题目保证 number 最大为100 static unsigned long long Counter[101] = {0}; Counter[0] = 1; Counter[1] = 1; Counter[2] = 2; static int calculatedIndex = 2; if(number <= calculatedIndex) return Counter[number]; //防止下标越界 if(number > 100) number = 100; for(int i = calculatedIndex + 1; i <= number; i++) { Counter[i] = Counter[i - 1] + Counter[i - 2]; } calculatedIndex = number; return Counter[number]; }搞定收工。
相关文章推荐
- Git学习记录---------(二)
- Delphi RichEdit的内容保存为图片
- 地理信息技术创业思考
- java中Date类详解
- Delphi 实现任务栏多窗口图标显示
- 关于Maven的依赖传递
- 【Android】一步一步教你从Eclipse移植项目到Android Studio(1.4)
- MongoDB中建立索引对查询性能的影响(2015-11-26 22:09:02)
- setTimeout与setInterval区别
- 108 Which two statements are true about the Automatic Diagnostic Repository (ADR)? (Choose two.) A.
- UIScrollView视差模糊效果
- 【算法】高效计算n的m次方
- Beta版本冲刺计划及安排
- LeetCode OJ:H-Index(H指数)
- Android的一个登录小实例
- Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive
- 为lua table写保护变成只读
- HDU 1045 Fire Net(二分匹配)
- 拦截器记录
- try catch finally中return的 执行顺序问题