题目描述:

在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.
例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图:

输入描述:

输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (1≤n≤90)。

输出描述:

对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。

输入例子:

1
3
2

输出例子:

1
3
2


本质仍然是斐波那契数列问题。

普通的斐波那契求解我们已经不陌生
下面是斐波那契问题的求解优化:

记录子问题的解,来避免下次遇到相同子问题时的重复计算。
以斐波那契数列为例子:
斐波那契数列定义为F0 =1,F1 = 1,Fn = Fn-1+Fn-2(n>=2)
递归写法为:

int F(int n){if(n == 0 || n == 1) return 1;else return F(n-1) + F(n-2);
}

这个递归会涉及到很多重复的计算,如当n==5时,可以得到F(5)= F(4)+F(3),接下来计算F(4)时又会有F(4)= F(3)+F(2),这时不采取措施,F(3)将会被计算两次。如果n很大,重复计算的次数将难以想象。

实际上由于没有保存中间计算的结果,实际复杂度将会高达O(2n),即每次都会计算F(n-1)和F(n-2)这两个分支,基本上不能承受n较大的情况。

开一个数组dp,用来保存已经计算过的结果,其中dp[n]记录F(n)的结果,并用dp[n] = -1来表示F(n) 当前还没有被计算过。

int dp[MAXN];

然后就可以在递归中判断dp[n]是否是-1,如果不是-1,说明已经计算过F(n),直接返回dp[n]就是结果;否则,按照递归式进行递归。

int F(int n){if(n == 0 || n == 1) return  1;if(dp[n] != -1) return dp[n];else{dp[n] = F(n-1) + F(n-2);return dp[n];}
}

通过记忆化搜素,把复杂度从O(2n)降到O(n)。
斐波那契数列递归图:

斐波那契数列记忆化搜索示意图:


斐波那契数列记忆化搜索示意图:

代码:

#include<iostream>
#include<cstring>
using namespace std;typedef long long ll;ll dp[10000];ll F(int n){if(n==1) return 1;if(n==2) return 2;if(dp[n]!=-1) return dp[n];else{dp[n] = F(n-1)+F(n-2);return dp[n];}
}int main(){memset(dp, -1, sizeof(dp));int n;while(~scanf("%d",&n)){printf("%lld\n",F(n));}return 0;
}

PAT练习 骨牌铺方格相关推荐

  1. hdu 2046 骨牌铺方格 递推求解

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  2. HDOJ 2046 骨牌铺方格 【递推】

    HDOJ 2046 骨牌铺方格 [递推] 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2046 铺2*1只有一种情况(一竖) 2*2有两种情况(两横或 ...

  3. HDU2046 骨牌铺方格【递推】

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  4. 骨牌铺方格java_[ACM_HDU_2046]骨牌铺方格 | 学步园

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  5. 骨牌铺方格(递归问题)

    骨牌铺方格 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图 ...

  6. HDU 2046 骨牌铺方格 递推

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  7. HDU 2046 骨牌铺方格【递推】

    骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  8. 骨牌铺方格(HDU-2046)

    Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Inpu ...

  9. HDU_oj_2046 骨牌铺方格

    Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Inpu ...

最新文章

  1. pta简单实现x的n次方_PTA-2017实验2.4 函数
  2. 超图js版本加载点图层和点要素
  3. win2012每次启动显示服务器管理器,win2012r2服务器管理器打开角色.功能出错
  4. Windows在当前目录快速打开cmd的方法
  5. table row设置cell的html,css中display设置为table、table-row、table-cell后的作用及其注意点...
  6. linux sed命令的常用方法
  7. windows7正版验证_Windows7 寿终正寝:那些一并消逝的软件你知多少?
  8. linux 分割pdf,PDFBox分割PDF文档
  9. FreeMarker三宗罪!
  10. 安卓虚拟机_[手机软件] 这款应用牛逼了,安卓手机上的虚拟机 - 虚拟大师
  11. 傲梅分区助手 linux,傲梅分区助手专业版
  12. web前端开发学习经验分享——css,js进阶篇
  13. 真人语音朗读软件_讯飞语音云助力移动“和阅读”,打造个性化听书应用
  14. 解决import lief运行报错问题
  15. 空间直线和三维物体之间的交线相关问题
  16. 简述计算机基本工作原理以及指令执行步骤,计算机的指令执行过程分为四步请简述它们简述...
  17. python修改桌面壁纸_利用Python对windows桌面自动更换壁纸
  18. 区块链P2P网络协议演进过程
  19. Arcgis如何让其显示中文(英文)
  20. 关于“24点”游戏的解法

热门文章

  1. iOS开发键盘设置,IOS7深灰色键盘
  2. 物联网普及率目前第一是韩国
  3. win10系统.android是什么文件夹,d盘文件不见了怎么恢复?Windows10增加安卓程序运行...
  4. 如何设置成半透明效果
  5. flickr 的全局主键生成方案
  6. Android 屏幕常亮 背景常亮
  7. ASP.NET入门篇【项目实战】打造一个自己的相册(二)登录模块
  8. 蓝桥杯--矩阵翻硬币
  9. C/C++版本更迭历程
  10. js正则的test方法一会返回true一会返回false