题目来源
题目描述
class Solution {
public:
/**
* @param n: An integer
* @return: An Integer
*/
int climbStairs2(int n) {
// write your code here
}
};
题目解析
一维坐标性动态规划
设起始坐标为0,要求到达终点坐标n一共有几种走法。每次可以走1、2、3步
(1)确定状态
- 最后一步:
- 不管怎么走,总有最后一步。最后一步的坐标为
n
,那么前一步可能是:- 情况一:前一步是
n - 1
- 情况二:前一步是
n - 2
- 情况三:前一步是
n - 3
- 情况一:前一步是
- 题目要求知道从坐标
0
到达坐标n
一共有几种走法,就要先知道:- 情况一:从坐标
0
到达坐标n - 1
一共有几种走法 - 情况二:从坐标
0
到达坐标n - 2
一共有几种走法 - 情况三:从坐标
0
到达坐标n - 3
一共有几种走法
- 情况一:从坐标
- 然后把这三种坐标加起来就是一共有几种走法
- 不管怎么走,总有最后一步。最后一步的坐标为
- 状态:
- 设
d
p
[
n
]
dp[n]
dp[n]为从坐标
0
到坐标n
一共有几种走法
- 设
d
p
[
n
]
dp[n]
dp[n]为从坐标
(2)转移方程
- 一般情况: d p [ n ] = d p [ n − 1 ] + d p [ n − 2 ] + d p [ n − 3 ] , n > 3 dp[n] = dp[n - 1] + dp[n - 2] + dp[n - 3], n > 3 dp[n]=dp[n−1]+dp[n−2]+dp[n−3],n>3
- 当n = 0时,dp[0] = 1
- 当n = 1时,从坐标0到坐标
1
一共有1种走法: d p [ 1 ] = 1 dp[1] = 1 dp[1]=1 - 当n = 2时,从坐标0到坐标
2
一共有2种走法: d p [ 2 ] = 2 dp[2] = 2 dp[2]=2 前一步可能是- 前一个坐标是1 ---- 1
- 前一个坐标是0 ---- 1
- 当n = 3时,从坐标0到坐标
3
一共有4种走法: d p [ 3 ] = 4 dp[3] = 4 dp[3]=4 前一步可能是- 前一个坐标是2 — 2
- 前一个坐标是1 — 1
- 前一个坐标是0 — 1
(3)边界情况和初始条件
- 如果n < 0,返回-1
- 如果n = 0,返回1
(4)计算顺序
- dp[0]、dp[1]、dp[2]、dp[3]、…dp[n]
- 答案是dp[n]
class Solution {
public:
/**
* @param n: An integer
* @return: An Integer
*/
int climbStairs2(int n) {
if(n < 0){
return -1;
}
std::vector<int> dp(n + 1);
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; ++i) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
return dp[n];
}
};