1<=n<=45
使用动态规划有五个步骤
- 确定dp数组及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
对于这个爬楼梯的题目,dp数组的每一项dp[i]可以表示爬到第i阶楼梯的方法总数。 到达第i级台阶,可以从它的前一级上去,也可以从它的前两级上去,分别是dp[i-1]和dp[1-2],这里需要注意从前两级上到第i级只是一种方法,不能误认为从前两级到第i级有两种方法,同样从前一级到第i级也只是一种方法。如果弄糊涂了,在写状态转移方程时就会错误地加上1和2。递推公式是dp[i]=dp[i-1]+dp[i-2]。初始化dp数组有n+1个元素,dp[1]=1,dp[2]=2,从i=3开始遍历。如果遇到边界条件比如n=1或n=2,由于从下标3开始遍历,要做是否n==1的判断,防止初始化dp[2]发生数组越界。
代码如下
class Solution
{
public:
int climbStairs(int n) {
if(n==1)return 1;
vector<int>dp(n+1,0);
dp[1]=1,dp[2]=2;
for(int i=3;i<n+1;i++){
dp[i]=(dp[i-1]+dp[i-2]);
}
return dp[n];
}
};