动态规划解决爬楼梯 ,题目来源:力扣 70. 爬楼梯

力扣 70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

先了解动态规划

动态规化判断条件:
1.重叠子问题

重叠就是算出来的东西还要用到它,比如这道题,1到5台阶我求出来了,我现在算1到六,本来我重新算的,但是现在把1到五保存起来就直接用

2。最优子结构

不管以后咋样当前我就是最好,

3.无后效性

就算后面计算也不会影响我,就一句话,算出来就不变

怎样完成呢:
1.确定状态,类似于递归结束条件,一般就是开始结尾状态很特殊

刚开始台阶一个,只有一个可能,只走一步 台阶二个两种可能,一下两步,一次一步,
dp[1] = 1;
dp[2] = 2;

2.状态转移方程(最难的一步)

思路是这样的,这个人最后成功爬上第n阶之前,只有两种可能,爬了一阶或者两阶,因此此时他总共可拥有的次数,即为他最后爬了一阶情况下原来n-1阶的次数加上最后爬了两阶时原来n-2阶的次数。用这种思路一直向前推,直到原来n-1或n-2为一阶或两阶的情况,这时我们可以计算n=1时,只有一种情况,n=2有两种情况(一下爬了两阶,两次都爬一阶),这就是此递归的结尾。如果把递归式子写出来,就是dp[n]= dp[n-1] + dp[n-2]


class Solution {

    public int climbStairs(int n) {
	//这是特殊值,不算初始状态
	if (n == 1) {
            return 1;
        }
        int[] dp = new int[n + 1];
        //初始状态
        dp[1] = 1;
        dp[2] = 2;
       //注意从3开始,1,2是初始条件
        for (int i = 3; i <= n; i++) {
        //状态转移,递归转移类似
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        //返回最后一个计算得值,n个台阶可能方式
        return dp[n];
    }
}

猜你喜欢

转载自blog.csdn.net/code_mzh/article/details/105774670