贪心算法详解

  	之前讲过动态规划DP,现在来说说贪心。
	贪心算法在解决问题的策略上目光短浅,只根据当前已有的信息就做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。也就是说贪心对于算法的每一个决策点,每一次的选择,做一个当时看起来是最佳的选择。它并不是从整体最优考虑,它所做出的选择只是在某种意义上的局部最优。贪心算法对于大部分的优化问题都能产生最优解,但不能总获得整体最优解,通常可以获得近似最优解	我们先从DP来过渡到贪心,先来看一个例子,活动选择问题。
	假设有一个需要使用某个资源(教师等场地)的n个活动组成的集合S= {a1,a2,···,an },该资源每次只能由一个活动占用。每个活动a[i]都有一个开始时间s[i]和结束时间f[i],且0<= s[i] < f[i] <∞。一旦被选择后,活动a[i]就占据半开时间区间[s[i],f[i])。若时间区间[s[i], fi)与区间[sj, fj)互不重叠,则称活动a[i]与活动a[j]是兼容的。也就是说,当s[i]≥f[j]或s[j]≥f[i]时,活动a[i]与活动a[j]相容。活动选择问题就是要选择一个由兼容活动构成的最大集合。
例子

	活动都按结束时间非递减排序了(后面会讲why),这个例子的最大集合就是{a[1],a[4],a[8],a[11]}和{a[2],a[4],a[9],a[11]}。

	很容易看出来这是一个DP问题,跟之前的求数组中最长递增子序列是类似的。状态转移方程就是LIS[i]=max{1,LIS[k]+1}   (a[i]和a[k]是兼容的for any k < i)。而且更重要的是我们还可以根据结束时间给每一个活动排序,这样代码就更容易写出来,这里就不贴了。

	如果是这个DP方程的话,我们是没法从DP过渡到贪心的。我们再来看一个更好的DP算法。
	既然是DP,肯定要找状态转移方程。不过我们先来寻找子问题,什么是这个原问题的子问题呢?我们刚才说到,活动选择问题就
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值