public class Solution {
public int climbStairs(int n) {
if (n == 1) {
return 1;
}
int[] dp = new int[n + 1];
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
}
典型的动态规划算法
动态规划算法的思想就是,每次解决问题的一部分
后面的计算利用前面的结果,而不必每次从头算起。
这里开了一个dp的数组,每次计算一个台阶。
而当前台阶的走法是前面两个台阶走法的和。
爬楼梯 可以爬2阶或者1阶 就可以把整个过程分解
将最后一次爬分解出来
最后一阶就有两种情况
1. 爬了前N-1 阶 最后一阶 只需要爬1阶
2. 爬前N-2 阶 最后一阶爬两阶
所以 dp[i]=dp[i-1]+dp[i-1]
首先,把上i级台阶所有的方法数用dp[i]表示。
如果有i(i>2)级台阶的话,第一步有两种选择:一次上两级与一次上一级。
所以上i级台阶所有的方法数就等于dp[i]=dp[i-1]+dp[i-1]
然后这样递归下去。
我记得这是高中的排列组合题,当时老师也有讲这个方法。
这就是一个动态规划。