贪心算法、动态规划(解题步骤、区别联系)

1.贪心算法

  • 贪心点:贪心算法即贪心选择策略(判断怎么选择才能做到每一次选择达到局部最优,即找到贪心点)
  • 排序:贪心问题一般都涉及到排序(Comparable、Comparator),通常可能会涉及到两个选择属性自定义排序
  • 选择:在排好序进行选择时,通常会选择满足可行解中最小的解,将更大的可行解保留用于解决之后的选择(既做到了局部最优,又有保留的将更有利的的解留到了后续选择中,做到了贪心)
  • 辅助:常利用数组记录进行局部选择时满足可行解的个数或顺序位置

2.动态规划

  • 1.动态规划算法一般都有下面两种实现方式,前者称为递归版本,后者称为迭代版本,且两个版本是可以相互转换的。
    - 1.直接自顶向下实现递归式,并将中间结果保存,这叫备忘录法;
    - 2.按照递归式自底向上地迭代,将结果保存在某个数据结构中求解。
  • 2.一般求解思路
    1.原问题分解为子问题
  • 把原问题分解为若干个子问题,子问题和原问题地形式相同或类似,只是规模变小了。当子问题都解决时,原问题也就解决了。
  • 子问题一旦求出就立即保存(重叠子问题性质),所以每个问题只需被求解一次
    2.确定状态
  • 在动态规划问题中,常常将和子问题相关的各个变量的一组取值称之为一个“状态”,经常碰到的情况是,k个整形变量能构成一种状态(如数字三角形问题中的行号和列号)。如果k个整形变量取值范围分别是N1、N2、N3…Nk,那么,我们经常会用一个k维数组 array[N1][N2][N3]…[Nk]来存储各个状态的值,而此值就是当前状态下子问题的解; 并且,此值未必是一个整形或浮点数,可能需要一个结构才能表示的,那么array数组就是一个结构数组。
    3.确定一些初始状态(边界状态)的值
  • 动态规划问题中经常采用递推实现,可以初始化最底层状态下的值。
    4.确定状态转移方程
  • 定义出什么是“状态”,以及在该“状态”下的值后,就要找出不同状态之下如何迁移——即如何从一个或多个“值”(已知的状态),求解出另一个“状态”下的值(“人人为我” 递推型) 状态的迁移可以用递推公式表示,此递推公式被称为:“状态转移方程”

3.贪心与动规区别联系

  • 1.概念

  • 贪心算法
    基本思想:贪心算法并不从整体最优上加以考虑,它所做的选择只是在某种意义上的局部最优解。
    基本要素:最优子结构性质贪心选择性质

  • 动态规划
    基本思想:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
    基本要素:最优子结构性质重叠子问题性质无后效性
    无后效性: 当前若干个值一旦确定后,此后过程的演变只与这若干个状态的值有关,和之前采用那种手段或经过哪条路径演变到当前若干个状态无关。

  • 区别联系

  • 共同点:两者都具有最优子结构性质

  • 不同点:
    1.动态规划算法中,每步所做的选择往往依赖于相关子问题的解,因而只有在解出相关子问题时才能做出选择。
    贪心算法,仅在当前状态下做出最好选择,即局部最优选择,然后再去解做出这个选择后产生的相应的子问题,对后续子问题继续选择从而达到全局最优。
    2.动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常自顶向下的方式进行。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值