力扣 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];
}
}