原题网址:https://www.lintcode.com/problem/climbing-stairs/description
描述
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
您在真实的面试中是否遇到过这个题?
样例
比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法
返回 3
标签
动态规划(DP)
思路:这道题也是用动态规划的方法来解,但区别于数字三角形和最小路径和,此题的状态转移方程没有那么明显。
为了梳理思路,先列举几个n 为小数值的解。
n = 1,只有一种解法;
n = 2,有 1+1 = 2,2 = 2,两种解法;
n = 3,有 1+1+1 = 3,1+2 = 3,2+1 =3 三种解法;
n = 4,有 1+1+1+1 = 4,1+1+2 = 4,1+2+1 = 4,2+1+1 = 4,2+2 = 4 五种解法;
n = 5,有 1+1+1+1+1 = 5,1+1+1+2 = 5,1+1+2+1 = 5,1+2+1+1 = 5,2+1+1+1 = 5, 1+2+2 = 5, 2+1+2 = 5, 2+2+1 = 5 八种解法;
n = 6,同理,有13种解法,这里不再罗列。
通过观察可以发现,当 n >= 3 时,n 解法个数 = n-1个数 + n-2个数。
所以可以定义一个一维数组dp【n】,初始dp【0】=1,dp【1】=2。
状态转移方程为 dp【i】= dp【i-1】+ dp【i-2】。
最后return dp【n-1】。
AC代码:
class Solution {
public:
/**
* @param n: An integer
* @return: An integer
*/
int climbStairs(int n) {
// write your code here
if (n<=0)
{
return 0;
}
if (n==1)
{
return 1;
}
vector<int> dp(n,0);
dp[0]=1;
dp[1]=2;
for (int i=2;i<n;i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n-1];
}
};
蠢了,理解爬楼梯问题还有更直接的方式。
n=1,一种;
n=2,两种;
n=3,三种;(要么从第1级迈上来,要么从第2级迈上来)
n=4,五种;(要么从第2级迈上来,要么从第3级迈上来)
……
n=i,要么从第 i -1 级迈上来,要么从第 i-2 级迈上来。
所以状态转移方程一目了然,dp【i】= dp【i-1】+ dp【i-2】。
参考:https://blog.csdn.net/Sunny_Ran/article/details/49722333 与 https://blog.csdn.net/ouyangjinbin/article/details/51083767
关于代码实现,还可以使用递归的方式。如果嫌递归方式效率低,还可以用循环。这样不需要额外定义动态规划数组浪费空间。