本篇文章比较总结了贪心算法和动态规划的内容。
我的个人博客:orbisz-blog
贪心算法
贪心法是一种求解最优化问题的算法设计策略,有时也可以用来单单找可行解。贪心法是通过分布决策的方法来求解问题的,在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局结果也最优的算法策略。通常只考虑局部最优性
问题的全局最优解可以通过一系列局部最优选择得到。即每一步的选择都是当前状态下的最优选择,且不会影响后续步骤的选择。 问题的最优解包含其子问题的最优解。通过解决子问题的最优解,可以递推得到原问题的最优解。
基本步骤
- 贪心选择性质:局部最优能导出全局最优。
- 最优子结构:问题的整体最优解包含子问题的最优解
适用于可以用“当前最优”构建“全局最优”的问题
算法流程
1.定义贪心选择规则
- 明确每一步中如何选择当前状态下的“最优决策”(如选最大值、最早结束、最小代价等)
2.判断贪心选择性质和最优子结构
- 验证局部最优是否能导出全局最优(即贪心是否适用)
- 确认当前选择不会影响后续决策空间(无后效性)
3.初始化问题状态
- 初始化记录变量(如最远可达位置、当前覆盖范围、当前时间等)
4.按照策略遍历或排序
- 若需要排序,则按贪心标准排序(如按结束时间、单位价值等)
- 按顺序遍历每个元素,依次做出贪心决策并更新状态
5.返回目标结果
- 根据问题目标返回布尔值、计数值、最优路径等结果
例题
动态规划
将复杂问题分解成子问题,保存子问题的解来避免重复计算,从而获得整体最优解的算法思想。
基本思想
- 最优子结构:整体问题的最优解可以通过子问题的最优解组合得到。
- 重叠子问题:子问题之间有重复,可以缓存。
- 无后效性:状态只与当前有关,历史状态无影响。
适用问题需要具有以下三个特性:
- 重叠子问题(重复计算)
- 最优子结构(子问题可以递推)
- 状态可表示(一般数组或二维数组表示)
算法流程
1.定义状态
- 明确“子问题”是什么,即:
- dp[i] 是什么含义?
- 若问题有多个维度(如重量和物品编号),可以用二维或多维 dp 数组。
2.确定状态转移方程(核心)
- 分析第 i 个位置/元素是如何由前面的状态推导出来的, 找出转移公式。
3.初始化边界条件 - 设置初始状态(如 dp[0]、dp[1])
- 边界状态代表最小输入规模的已知结果
3.确定遍历顺序
- 一维时:正序或倒序(如 0/1 背包需要倒序避免重复选)
- 多维时:决定嵌套循环的顺序
- 遍历顺序必须匹配状态转移逻辑,保证前置状态先于当前状态计算完成
4.返回结果
- 根据题目要求返回最终状态值
贪心抓眼前,快而不一定最优;
动态思全局,慢但保最优解;
能贪心就贪,不能贪就动态规划