LeetCode 70. 爬楼梯
解题思路:使用动态规划,类似于不同路径那道题,属于计数型动态规划。不同路径那种坐标型的动态规划,当前第i行第j列的方案树值取决于上一行和前一列各自贡献的加和。这道题,dp[i]只能从dp[i - 1]和dp[i - 2]过来,所以状态转移方程就是:dp[i] = dp[i - 1] + dp[i - 2]
官方解答:
注:要爬n个台阶,dp一开始要开n + 1大小。最后一个状态为dp[n],而非之前的dp[n -1]。下面给出两种代码实现,一种是普通的动规实现,另一种使用了滚动数组进行了优化。
代码实现:
//普通动态规划实现
class Solution {
public:
int climbStairs(int n) {
//初始化
vector<int> dp(n + 1, 0);
dp[0] = dp[1] = 1;//边界,起始点
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
//使用滚动数组的动态规划实现
class Solution {
public:
int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
};