746. 使用最小花费爬楼梯 - 力扣(LeetCode)
1、状态表示:
题目意思即:cost[i]代表从第i层向上爬1阶或者2阶,需要花费多少力气。如cost[0],代表从第0阶爬到第1阶或者第2阶需要cost[0]的力气。
一共有cost.size()阶台阶,爬到第cost.size()阶台阶最少需要花费多少力气。
即dp[i]代表,爬到第i阶最少需要花费多少力气。
2、状态转移方程:
首先:一次可以爬1阶或者2阶,并且花费的力气都是一样的。
那么dp[2],可以0-》2,从0爬到2花费的力气即为cost[0];也可以1-》2,从1爬到2花费的力气即为cost[1],但是前提是要爬到第1阶,而爬到第1阶所花费的力气为dp[1],则1-》2花费的力气为do[1] + cost[1]。所以dp[2] = min{cost[0],dp[1] + cost[1]}。
那么对于dp[i]:可以i-2-》i,从i-2爬到i花费的力气为cost[i-2],而爬到第i-2阶所花费力气为dp[i-2],则力气为dp[i-2] + cost[i-2];可以i-1-》i,从i-1爬到i花费的力气为cost[i-1],而爬到第i-1阶所花费力气为dp[i-1],则力气为dp[i-1] + cost[i-1]。
所以dp[i] = min{dp[i-2] + cost[i-2],dp[i-1] + cost[i- 1]}。
3、初始化:
题目所说,可以从第0层开始爬,也可以从第1层开始爬。所以初始化dp[0] = dp[1] = 0。
4、遍历顺序:
肯定是最高台阶由小变大遍历,即i从小到大遍历。
5、返回值:
返回dp[cost.size()],即n阶台阶。
class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();//一共n阶台阶//越界检查if(n == 0 || n == 1) return 0;vector<int> dp(n+1);//dp表,大小为n+1dp[0] = 0,dp[1] = 0;//初始化dp[0] = dp[1] = 0for(int i= 2;i<=cost.size();i++)//遍历顺序{dp[i] = std::min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]);//状态转移方程}return dp[cost.size()];//返回值}
};