楼主: wwwyhx
跳转到指定楼层
上一主题 下一主题
收起左侧

Ananimous(2) 找出得分最高的无重复子段

 
🔗
ljfljf2006 2011-4-24 11:56:14 | 只看该作者
全局:
我把题目和大家的评论都看了想了。感觉DP思路大家都能想到,只是在寻找前一个衔接点的时候做法不一样。
楼主提到的直接用for循环从后往前遍历,,效率是O(N^N),通常情况下已经够用了。MM的算法我看了半天不是很明白。喜欢Imbalism提出的二分,简单明了,效率稳定。

评分

参与人数 1大米 +23 收起 理由
wwwyhx + 23

查看全部评分

回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-4-24 12:33:10 | 只看该作者
全局:
我把题目和大家的评论都看了想了。感觉DP思路大家都能想到,只是在寻找前一个衔接点的时候做法不一样。
楼主提到的直接用for循环从后往前遍历,,效率是O(N^N),通常情况下已经够用了。MM的算法我看了半天不是很明白。喜欢Imbalism提出的二分,简单明了,效率稳定。
ljfljf2006 发表于 2011-4-24 11:56



    对,如果直接一个个向后查找效率在重合情况严重的情况下会很低,同意用二分,虽然实现复杂点但是效果更稳定
回复

使用道具 举报

🔗
benny 2011-4-25 11:25:41 | 只看该作者
全局:
本帖最后由 benny 于 2011-4-25 11:53 编辑

DP么?
按照时间点从前往后update一个数组dp


对于每个point n来说,有两种可能性
1.没有以这个point作为finish point的segment,那么这个点最大的score和等于前一个点,即dp[n]=dp[n-1],因为没有别的可能性了
2.如果有以这个点作为finish point的segment({m,s,n}),那么这个点最大的socre在dp[n-1],dp[m]+s里选一个最大的



不晓得对不对........
回复

使用道具 举报

🔗
darksteel 2011-4-25 13:30:19 | 只看该作者
全局:
回复 33# benny
差不多就是这样,这个题我一直关注的比较多,目前总结有如下结论:
如果按end对所有segment进行排序,那dp的时候对每个i需要找到满足seg[m].end<=seg.start的那个最大m,这个可以用二分,所以复杂度是O(nlogn)。
那个MM的方法是按start对segment排序,然后dp的过程中以end作为key维护一个堆,堆里的元素是dp[0..i-1],然后对于每个i从堆里弹出end<=seg.start的所有符合条件的元素,取最大的那个作为当前选择。由于每个元素进堆一次,因此复杂度也是O(nlogn)。两个方法都是很好的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表