一.746. 使用最小花费爬楼梯
FS+记忆化搜索优化:
cpp
const int N = 1010;
class Solution {
public:
int mem[N];
int dfs(vector<int>& cost, int x){
if(mem[x]) return mem[x];
int sum = 0;
if(x == 0 || x == 1) return 0;
else{
sum = min(dfs(cost, x - 1) + cost[x - 1], dfs(cost, x - 2) + cost[x - 2]);
}
mem[x] = sum;
return sum;
}
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
int ans = dfs(cost, n);
return ans;
}
};
动态规划:
cpp
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
const int N = 1010;
int n = cost.size();
int f[N];
for(int i = 2; i <= n; i++){
f[i] = min(f[i - 1] + cost[i - 1], f[i - 2] + cost[i - 2]);
}
return f[n];
}
};
二.300. 最长递增子序列
cpp
const int N = 2510;
class Solution {
public:
int mem[N];
int dfs(vector<int>& nums, int x){
if(mem[x]) return mem[x];
int ans = 1;
for(int i = 0; i < x; i++){
if(nums[i] < nums[x]){
ans = max(ans, dfs(nums, i) + 1);
}
}
mem[x] = ans;
return ans;
}
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
int ans = INT_MIN;
int f[N];
// for(int i = 0; i < n; i++){
// ans = max(ans, dfs(nums, i));
// }
// return ans;
for(int i = 0; i < n; i++){
f[i] = 1;
for(int j = 0; j < i; j++){
if(nums[j] < nums[i]){
f[i] = max(f[i], f[j] + 1);
}
}
}
return f[n];
}
};