PAT练习 骨牌铺方格
题目描述:
在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练习 骨牌铺方格相关推荐
- hdu 2046 骨牌铺方格 递推求解
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDOJ 2046 骨牌铺方格 【递推】
HDOJ 2046 骨牌铺方格 [递推] 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2046 铺2*1只有一种情况(一竖) 2*2有两种情况(两横或 ...
- HDU2046 骨牌铺方格【递推】
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 骨牌铺方格java_[ACM_HDU_2046]骨牌铺方格 | 学步园
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...
- 骨牌铺方格(递归问题)
骨牌铺方格 Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图 ...
- HDU 2046 骨牌铺方格 递推
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDU 2046 骨牌铺方格【递推】
骨牌铺方格 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 骨牌铺方格(HDU-2046)
Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Inpu ...
- HDU_oj_2046 骨牌铺方格
Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Inpu ...
最新文章
- pta简单实现x的n次方_PTA-2017实验2.4 函数
- 超图js版本加载点图层和点要素
- win2012每次启动显示服务器管理器,win2012r2服务器管理器打开角色.功能出错
- Windows在当前目录快速打开cmd的方法
- table row设置cell的html,css中display设置为table、table-row、table-cell后的作用及其注意点...
- linux sed命令的常用方法
- windows7正版验证_Windows7 寿终正寝:那些一并消逝的软件你知多少?
- linux 分割pdf,PDFBox分割PDF文档
- FreeMarker三宗罪!
- 安卓虚拟机_[手机软件] 这款应用牛逼了,安卓手机上的虚拟机 - 虚拟大师
- 傲梅分区助手 linux,傲梅分区助手专业版
- web前端开发学习经验分享——css,js进阶篇
- 真人语音朗读软件_讯飞语音云助力移动“和阅读”,打造个性化听书应用
- 解决import lief运行报错问题
- 空间直线和三维物体之间的交线相关问题
- 简述计算机基本工作原理以及指令执行步骤,计算机的指令执行过程分为四步请简述它们简述...
- python修改桌面壁纸_利用Python对windows桌面自动更换壁纸
- 区块链P2P网络协议演进过程
- Arcgis如何让其显示中文(英文)
- 关于“24点”游戏的解法