动态规划理论基础
讲解链接:代码随想录-动态规划理论基础
动态规划五部曲
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
509.斐波那契数
讲解链接:代码随想录-509.斐波那契数
public int fib(int n) {
if (n < 2) return n;
int preTwo = 0;
int pre = 1;
for (int i = 2; i <= n; i++) {
int f = preTwo + pre;
preTwo = pre;
pre = f;
}
return pre;
}
70.爬楼梯
讲解链接:代码随想录-70.爬楼梯
其实还是一个斐波那契数列,只是起始值不一样。
动态规划
public int climbStairs(int n) {
if (n <= 2) return n;
int preTwo = 1;
int pre = 2;
for (int i = 3; i <= n; i++) {
int sum = preTwo + pre;
preTwo = pre;
pre = sum;
}
return pre;
}
递归-暴力破解
int result = 0;
public int climbStairs(int n) {
backtracking(n);
return result;
}
void backtracking(int n) {
if (n == 0) {
result++;
return;
}
backtracking(n - 1);
if (n >= 2) {
backtracking(n - 2);
}
}
746.使用最小花费爬楼梯
讲解链接:代码随想录-746.使用最小花费爬楼梯
public int minCostClimbingStairs(int[] cost) {
int[] db = new int[cost.length + 1];
db[0] = 0;
db[1] = 0;
for (int i = 2; i <= cost.length; i++) {
db[i] = Math.min(db[i - 1] + cost[i - 1], db[i - 2] + cost[i - 2]);
}
return db[db.length - 1];
}
总结
今天的都是简单题哎