day32动态规划 | lc509斐波那契数列 | lc70爬楼梯 | lc746最小花费爬楼梯
day32动态规划
动态规划基础
动态包含哪几类问题?
- 基础题
- 背包问题(面试必备)
- 打家劫舍
- 股票问题
- 子序列问题
解决动态规划要解决的问题
- dp数组的定义 下标的含义 以及如何初始化
整个数组表示什么意思 下标又是什么意思 怎么初始化
- 递归公式
- dp数组遍历顺序
- 打印dp数组
打印可以用在debug上面
lc509斐波那契数列
该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。 给定n 求f(n)
按照递归思想来求解
- 确定dp数组以及下标
dp[i] 表示第i个菲波那切数是dp[i]
比如dp[5]表示 第5个斐波那契数的值是dp[5]
- 确定递推公式
dp[i] = dp[i - 1] + dp[i - 2] 一个数是由前两个数相加得来的
- dp数组的初始化
1 1 2 得出
dp[0] = 1 dp[1] = 1
- 确定便利顺序
从前往后便利
- 打印dp数组
用于debug 看看和想象中的是否一样
public int fib(int n){
if(n <= 1) return n;
int[] dp = new int[n + 1];
dp[0] = 0; dp[1] = 1;
for(int i = 2; i <= n; i++) dp[i] = dp[i - 1] + dp[i - 2];
return dp[n];
}
lc70爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
举例假设
- 假设楼梯一共就一层 那就一次就上去了
- 假设一共2层
1+1 2 一共两种
- 有三层
1+1+1 2+1 1+2 一共三种 也就是一阶和二阶相加的结果
- 4层
4楼只能有2楼和3楼 所以是一共5种
dp[i] = dp[i-1] + dp[i - 2]
- 确定dp和i 以及初始化
dp[i] 是达到第i层 一共有dp[i]种方法
初始化 dp[1] = 1; dp[2] = 2;
public int fib(int n){
if(n <= 1) return n;
int[] dp = new int[n + 1];
dp[1] = 1; dp[2] = 2;
for(int i = 3; i <= n; i++) dp[i] = dp[i-1] + dp[i-2];
return dp[n];
}
lc746使用最小花费爬楼梯
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。
请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。
比如cost = [10, 15, 20] 楼顶的下标就是3 长度加一
dp[i] 代表达到下标i的位置 所需要的花费
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n = cost.length;
int[] dp = new int[n + 1];
dp[0] = 0; dp[1] = 0;
for(int i = 2; i <= n; i++) dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2]+cost[i-2]);
return dp[n];
}
}

浙公网安备 33010602011771号