746. 使用最小花费爬楼梯
题目地址 :746. 使用最小花费爬楼梯 - 力扣(LeetCode)
题解思路:dp
时间复杂度:O(n)
空间复杂度:O(n)
代码:
cpp
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
// dp[]: 爬到i位置的总最小费用
// 转移:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
// 初始化:dp[0, 1] = 0
// 顺序:前到后
int size = cost.size();
vector<int>dp(size + 1, 0);
dp[0] = 0;
dp[1] = 0;
for(int i = 2; i <= size; i++){
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[size];
}
};
62. 不同路径
题目地址 :62. 不同路径 - 力扣(LeetCode)
题解思路:dp
时间复杂度:O(m * n)
空间复杂度:O(m * n)
代码:
cpp
class Solution {
public:
int uniquePaths(int m, int n) {
// dp[][]: 该位置有多少种走法
// 转移:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
// 初始化:第一行和第一列为1
// 顺序:从左到右,从上到下;可以用滚动数组优化为dp[]
vector<vector<int>>dp(m, vector<int>(n, 0));
for(int i = 0; i < m; i++) dp[i][0] = 1;
for(int j = 0; j < n; j++) dp[0][j] = 1;
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
}
}
return dp[m -1][n - 1];
}
};