Climbing Stairs爬楼梯——动态规划
题目描写叙述:
初阶:有n层的台阶,一開始你站在第0层,每次能够爬两层或者一层。
请问爬到第n层有多少种不同的方法?
进阶:假设每次能够爬两层。和倒退一层,同一个位置不能反复走,请问爬到第n层有多少种不同的方法?
解题思路:
初阶:一维动态规划。爬楼梯数目事实上是一个斐波拉契数列。
假定f[i] 表示是爬到第i层的方法,那么f[i] = f[i-1] + f[i-2] //第i层的方法数目等于第i-1层数目加上第i-2层数目。
初值:f[0] = 1, f[1] = 1。 //最開始没有爬和第一层的方法数目为1.
输出:f[n] 爬到第n层的方法数目。
实现方法两种:迭代法、递归法
递归法:时间复杂度:O(n) ,空间复杂度:O(n)
迭代法:时间复杂度:O(n),空间复杂度:O(1)
//递归法
class Solution {
public:
/**
* @param n: An integer
* @return: An integer
*/
int climbStairs(int n) {
// write your code here
vector<int> ans(n+1);
ans[0] = 1;
ans[1] = 1;
for(int i=2; i<=n; i++)
ans[i] = ans[i-1] + ans[i-2];
return ans[n];
}
};
//迭代法
class Solution {
public:
/**
* @param n: An integer
* @return: An integer
*/
int climbStairs(int n) {
// write your code here
int prev = 0;
int cur = 1;
for(int i=1; i<=n; i++)
{
int tmp = cur;
cur += prev;
prev = tmp;
}
return cur;
}
};
进阶:參考这里
主要是倒退一层。这个地方可能会违背动态规划无后效性的原则。
那么我们要怎么转化呢?
由条件:同一个位置不能反复走。我们能够知道假设要退步的话,不能退两层以上,由于用两步退两层再一步前进两层,那就会走同样的位置。所以我们最多仅仅能退后一步。
那么题目的条件就能够转换两种情况。
a.跳两层(前进两层)。
b.退一层跳两层 (前进一层)。
1. State:
f[i][0] 表示最后一步是跳两层情况下爬到第i层的方法数目。
f[i][1] 表示最后是一步是退一层跳两层的情况下爬到第i层的方法数目。
2. Function:
f[i+1][1] = f[i][0] 最后一步是退一层跳两层的情况下爬到第i+1层的方法数目
等于 从第i层情况a的数目跳两层退一层。
这里不能考虑第i层的情况b的方法数,由于第i层情况b的数目是从第i+1层退一步得到的。
f[i+2][0] = f[i][0]+f[i][1] 最后一步是退一层跳两层的情况下爬到第i+2层的方法数目
等于 第i层全部情况跳两层。
3. Intialize:
f[0][0]=1初始化最開始没有爬的方法数目为1.
4. Answer:
f[n][0]+f[n][1] 爬到第n层a、b两种不同的方法的总和
Climbing Stairs爬楼梯——动态规划的更多相关文章
- climbing stairs(爬楼梯)(动态规划)
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- [LeetCode] 70. Climbing Stairs 爬楼梯问题
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- [LeetCode] 70. Climbing Stairs 爬楼梯
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- [LeetCode] Min Cost Climbing Stairs 爬楼梯的最小损失
On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...
- [LeetCode] 746. Min Cost Climbing Stairs 爬楼梯的最小损失
On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...
- Leetcode 70. Climbing Stairs 爬楼梯 (递归,记忆化,动态规划)
题目描述 要爬N阶楼梯,每次你可以走一阶或者两阶,问到N阶有多少种走法 测试样例 Input: 2 Output: 2 Explanation: 到第二阶有2种走法 1. 1 步 + 1 步 2. 2 ...
- LeetCode 70. Climbing Stairs爬楼梯 (C++)
题目: You are climbing a stair case. It takes n steps to reach to the top. Each time you can either cl ...
- [Leetcode] climbing stairs 爬楼梯
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
- [leetcode]70. Climbing Stairs爬楼梯
You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...
随机推荐
- 程序员Git代码托管平台
程序员Git代码托管平台 说到Git代码托管平台,首先推荐的是GitHub,好多好的开源项目都来自GitHub,但是GitHub只能新建公开的Git仓库,私有 仓库要收费,如果你做的是一个开源项目,可 ...
- php 多进程解决代码常驻内存的问题php 多进程解决代码常驻内存的问题
PHP不适合做常驻的SHELl进程,因为它没有专门的gc例程,也没有有效的内存管理途径. 如果用PHP做常驻SHELL,会经常被内存耗尽导致abort而unhappy. 而且,如果输入数据非法,而脚本 ...
- 编写自己的jquery插件
如何编写自己的jquery插件 Jquery的插件主要分为三类: .封装对象方法的插件:大部分插件都是封装对象的插件 .封装全局函数的插件:将独立的函数添加到jquery的命名空间之下.Jquery. ...
- 《Effective Java》读书笔记三(类和接口)
No13 使类和成员的可访问性最小化 要区别设计良好的模块与设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.模块之间只通过它们的API进行通信,一个 ...
- adobe acrobat 无效批注对象
http://blog.csdn.net/pipisorry/article/details/40894881 adobe acrobat一直弹出 无效批注对象 检查后提示:"本页面上的全部 ...
- vim设置文本宽度
'textwidth' 'tw' number (default 0) local to buffer ...
- [na]诺顿ghost磁盘对刻(备份系统分区或数据分区)
一 诺顿ghost简介 ,可以克隆分区 也可以克隆磁盘 ,克隆成img或磁盘内容对刻 ,磁盘分区--img---磁盘分区 磁盘---磁盘 二 操作步骤 对刻好的系统 整体思路: ,A是模板机,A有C ...
- Linux虚拟内存系统常用参数说明
1.admin_reserve_kbytes 给有cap_sys_admin权限的用户保留的内存数量,默认值是min(free pages * 3%, 8MB).这些内存是为了给管理员登录和杀死 ...
- intercepting IO request
Introduction to File System Filters https://msdn.microsoft.com/en-us/library/windows/hardware/dn6416 ...
- oracle日期合并 分别用逗号或者分号隔开
逗号隔开',' select LISTAGG(SUBSTR(TO_CHAR(FREESTARTTIME,,) ,)),',')WITHIN GROUP (ORDER BY TPF.FREEID) AS ...