贪心算法和动态规划详解

本篇文章比较总结了贪心算法和动态规划的内容。
我的个人博客:orbisz-blog

贪心算法

贪心法是一种求解最优化问题的算法设计策略,有时也可以用来单单找可行解。贪心法是通过分布决策的方法来求解问题的,在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局结果也最优的算法策略。通常只考虑局部最优性

问题的全局最优解可以通过一系列局部最优选择得到。即每一步的选择都是当前状态下的最优选择,且不会影响后续步骤的选择。 问题的最优解包含其子问题的最优解。通过解决子问题的最优解,可以递推得到原问题的最优解。

基本步骤

  • 贪心选择性质:局部最优能导出全局最优。
  • 最优子结构:问题的整体最优解包含子问题的最优解

适用于可以用“当前最优”构建“全局最优”的问题

算法流程

1.定义贪心选择规则

  • 明确每一步中如何选择当前状态下的“最优决策”(如选最大值、最早结束、最小代价等)

2.判断贪心选择性质和最优子结构

  • 验证局部最优是否能导出全局最优(即贪心是否适用)
  • 确认当前选择不会影响后续决策空间(无后效性)

3.初始化问题状态

  • 初始化记录变量(如最远可达位置、当前覆盖范围、当前时间等)

4.按照策略遍历或排序

  • 若需要排序,则按贪心标准排序(如按结束时间、单位价值等)
  • 按顺序遍历每个元素,依次做出贪心决策并更新状态

5.返回目标结果

  • 根据问题目标返回布尔值、计数值、最优路径等结果

例题

买卖股票的最佳时机

跳跃游戏

划分字母区间

动态规划

将复杂问题分解成子问题,保存子问题的解来避免重复计算,从而获得整体最优解的算法思想。

基本思想

  • 最优子结构:整体问题的最优解可以通过子问题的最优解组合得到。
  • 重叠子问题:子问题之间有重复,可以缓存。
  • 无后效性:状态只与当前有关,历史状态无影响。

适用问题需要具有以下三个特性:

  • 重叠子问题(重复计算)
  • 最优子结构(子问题可以递推)
  • 状态可表示(一般数组或二维数组表示)

算法流程

1.定义状态

  • 明确“子问题”是什么,即:
    • dp[i] 是什么含义?
  • 若问题有多个维度(如重量和物品编号),可以用二维或多维 dp 数组。

2.确定状态转移方程(核心)

  • 分析第 i 个位置/元素是如何由前面的状态推导出来的, 找出转移公式。
    3.初始化边界条件
  • 设置初始状态(如 dp[0]、dp[1])
  • 边界状态代表最小输入规模的已知结果

3.确定遍历顺序

  • 一维时:正序或倒序(如 0/1 背包需要倒序避免重复选)
  • 多维时:决定嵌套循环的顺序
  • 遍历顺序必须匹配状态转移逻辑,保证前置状态先于当前状态计算完成

4.返回结果

  • 根据题目要求返回最终状态值

贪心抓眼前,快而不一定最优;
动态思全局,慢但保最优解;
能贪心就贪,不能贪就动态规划

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-薛定谔的猫-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值