算法训练营(day38)
算法训练营(day38)
动态规划理论基础
动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。
举个例子:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。
动态规划中 dp[j]
是由 dp[j-weight[i]]
推导出来的,然后取 max(dp[j], dp[j - weight[i]] + value[i])
。
动态规划的解题步骤
- 确定
dp
数组(dp table)以及下标的含义 - 确定递推公式
dp
数组如何初始化- 确定遍历顺序
- 举例推导
dp
数组
509. 斐波那契数
题目链接:https://leetcode.cn/problems/fibonacci-number/description/
斐波那契数 (通常用 F(n)
表示)形成的序列称为 斐波那契数列 。该数列由 0
和 1
开始,后面的每一项数字都是前面两项数字的和。也就是:
1 | F(0) = 0,F(1) = 1 |
给定 n
,请计算 F(n)
。
解题思路
解题过程:动态规划
- 由题可得,每一项数字都是前面两项数字的和
- 从
i = 2
开始遍历即可得到解
详细代码
1 | class Solution { |
70. 爬楼梯
题目链接:https://leetcode.cn/problems/climbing-stairs/description/
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
解题思路
解题过程:动态规划
- 每次可以爬
1
或2
个台阶 - 每多一个台阶,爬楼方法等于前面两次的方法和
详细代码
1 | class Solution { |
746. 使用最小花费爬楼梯
题目链接:https://leetcode.cn/problems/min-cost-climbing-stairs/description/
给你一个整数数组 cost
,其中 cost[i]
是从楼梯第 i
个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0
或下标为 1
的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
解题思路
解题过程:动态规划
- 相比于上一题,本题多了支付费用,需要找 最小值
- 相比于上一题,第一次爬楼梯{0,1}是不需要花费费用的
- 从第二级台阶开始,最小支付费用等于前面两次爬楼梯支付费用的最小值
- 动态规划,返回累计值
详细代码
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小明学习博客!
评论
ValineDisqus