动态规划解题步骤:
1.确定状态表示:dp[i]是什么
2.确定状态转移方程:dp[i]等于什么
3.初始化:确保状态转移方程不越界
4.确定填表顺序:根据状态转移方程即可确定填表顺序
5.确定返回值
题目链接:746. 使用最小花费爬楼梯 - 力扣(LeetCode)
题解1:
1.状态表示:dp[i]表示到达下标为i台阶的最小花费
2.状态转移方程:dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2])
3.初始化:初始化dp[0]=0、dp[1]=0
4.填表顺序:从左向右
5.返回值:dp[n](n为台阶数)
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
size_t n=cost.size();
//无需处理边界条件,n默认>=2
//创建dp表
vector<int> dp(n+1);
//初始化
dp[0]=dp[1]=0;
//填表
for(int i=2;i<=n;++i)
dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
//返回值
return dp[n];
}
};
题解2:
1.状态表示:dp[i]表示从下标为i的台阶出发到达楼顶的最小花费
2.状态转移方程:dp[i]=cost[i]+min(dp[i+1],dp[i+2])
3.初始化:初始化dp[n-1]=cost[n-1]、dp[n-2]=cost[n-2]
4.填表顺序:从右向左
5.返回值:min(dp[0],dp[1])
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
size_t n=cost.size();
//无需处理边界条件
//创建dp表
vector<int> dp(n);
//初始化
dp[n-1]=cost[n-1];dp[n-2]=cost[n-2];
//填表
for(int i=n-3;i>=0;--i)
dp[i]=cost[i]+min(dp[i+1],dp[i+2]);
//返回值
return min(dp[0],dp[1]);
}
};