LeetCode 70 Climbing Stairs(爬楼梯)(动态规划)(*)


翻译

你正在爬一个楼梯。它需要n步才能到底顶部。

每次你可以爬1步或者2两步。

那么你有多少种不同的方法爬到顶部呢?

原文

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps.

In how many distinct ways can you climb to the top?

分析

动态规划基础题,首先设置3个变量用于转换:

int dp1 = 1, dp2 = 2, dpWay = 0;

根据题意,一次只能是一步或两步,所以当n等于2时,有两种走法:1+1,2。

if (n <= 1) return dp1;
if (n == 2) return dp2;

从3开始,因为可以直接获得它的步数结果,所以直接写成:

while ((n--)-2) {
}

最终里面的变化方式为:

dpWay = dp1 + dp2;
dp1 = dp2;
dp2 = dpWay;

上一篇博客: LeetCode 206 Reverse Linked List(反转链表)(四步将递归改写成迭代)(*) ,介绍了如何将递归改写成迭代,看过的童鞋应该会觉得非常容易的,那么这里再来转换一次:

int climbStairsIter(int n,  int dpWay,int dp1, int dp2) {
if (n <= 1) return dp1;
if (n == 2) return dp2;
if ((n--) - 2) {
dpWay = dp1 + dp2;
dp1 = dp2;
dp2 = dpWay;
return climbStairsIter(n, dpWay, dp1, dp2);
}
else return dpWay;
}

int climbStairs(int n) {
return climbStairsIter(n, 0,1,2);
}

因为这里的参数涉及到执行前面顺序,所以最好还是单独列出来了,不过这样看来略不简洁呐。

代码

class Solution {
public:
int climbStairs(int n) {

int dp1 = 1, dp2 = 2, dpWay = 0;
if (n <= 1) return dp1;
if (n == 2) return dp2;

while ((n--) - 2) {
dpWay = dp1 + dp2;
dp1 = dp2;
dp2 = dpWay;
}
return dpWay;
}
};
本站声明
本文转载自:http://blog.csdn.net/nomasp/article/details/50514606     作者:NoMasp     发布日期:2016/01/14     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


 
© 2014-2017 ITdaan.com 粤ICP备14056181号