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?
Note: Given n will be a positive integer.
Example 1:
Input: 2 Output: 2 Explanation: There are two ways to climb to the top. 1. 1 step + 1 step 2. 2 steps
Example 2:
Input: 3 Output: 3 Explanation: There are three ways to climb to the top. 1. 1 step + 1 step + 1 step 2. 1 step + 2 steps 3. 2 steps + 1 step
class Solution {
public:
int climbStairs(int n) {
int dp[n+1];
for(int i=0;i<=n;i++)
{
if(i==0)
{
dp[i]=0;continue;
}
if(i==1)
{
dp[i]=1;continue;
}
if(i==2)
{
dp[i]=2;continue;
}
dp[i]=dp[i-1]+dp[i-2]; //到了第i步有多少种不同走法总数取决于跨一步前的走法数+跨两步前的走法数
}
return dp[n];
}
};
大致思路:
动态规划!!!我觉得还是一个思路问题吧!!!
首先,你看这种题干,一去想它是不是可以拆解成同规模子问题的,好像是可以的,因为不管你走多少步,每次都同性质——有自己的不同走法总数,二去想它子问题和父问题的关联,子问题如何决定父问题——如代码中红字。
那么关键就是你如何书写动态规划的状态转移方程——首先①dp数组的值代表的是所求,那么值代表的就是不同走法总数。然后②它是一维还是二维,下标代表什么呢?emmm这道题应该是一维,下标代表步数。③子问题和父问题的关联表示 ④临界条件的设置
问题迎刃而解了,dp[i]=dp[i-1]+dp[i-2],再把临界方程写好,从小到大遍历(因为这不是递归,注意区别——递归是直接调用让它自己回到临界条件,而动态规划是要从临界条件出发,一步步把子规模的问题求好了,最后求到大问题也就是所求)。
本文解析了一个经典的动态规划问题——爬楼梯。通过分析不同步数到达顶部的方法数量,使用动态规划方法得出解决方案。并给出了详细的代码实现及思路分析。

1342

被折叠的 条评论
为什么被折叠?



