如何在给定N次切割的情况下找到无限杆的最大段数

时间:2014-01-05 03:29:03

标签: algorithm optimization

假设我们得到一个无限长度的杆,我们也给出了像[L1,L2]这样的N个段。 这意味着我们可以在L1和L2之前切割杆以获得一个区段。一些区段可能重叠。

例如,我们给出N = 4和

[2,3)
[1,9)
[4,5)
[5,8)

We can chose

[2,3)
[4,5)
[5,8)

细分以获得最多三个细分。我不知道有没有任何众所周知的好算法呢?如果有的请建议我。我能够手动完成它但不能得到一个好的工作算法。

2 个答案:

答案 0 :(得分:1)

按终点排序。

遍历各个片段,选择不会导致与前一个片段重叠的片段(可以通过简单地跟踪最后一个终点并检查起点是否在该点之后来检查。)

这将始终提供最佳解决方案。

对于您的示例,在排序后,我们有:

[2,3)
[4,5)
[5,8)
[1,9)

然后我们浏览[2,3)[4,5)[5,8)[1,9),挑选除[1,9)以外的所有内容。

为什么这是最佳的

显然,具有最小终点的段将成为我们的选择之一,因为与其重叠的任何段将具有更大的终点,因此可以与从更大的值开始的更多段重叠,并且任何段B重叠具有最小端点的段A也将与任何与A重叠的段重叠,因此B不能是比A更好的选择。

从这里开始,我们为下一个具有最小端点且不与前一个端点重叠的段重复此参数,直到我们结束。

答案 1 :(得分:0)

这实际上是动态编程与贪婪编程最常见的例子之一。 我实际上只能给你这个链接:http://www.geeksforgeeks.org/dynamic-programming-set-13-cutting-a-rod/ 它将向您展示实现它的动态方式。 Dukeling答案是一种贪婪的算法。

动态和贪婪有什么区别? 让我告诉你钱。 假设你有123美元,有1美元,2美元,5美元,10美元,20美元,50美元的钞票。怎么用最少的账单来做呢?

贪婪目前总能找到最佳选择。它将获得在特定时刻可以采取的最大法案。首先它需要50,然后是50,然后是20,然后是2,然后是1.

但是,如果我们有100美元,1美元,99美元,24美元的账单怎么办? 贪婪首先需要100,然后花费1美元23次。

动态的作用是根据之前做出的决定来分析当前的决定并纠正过去不正确的决定。这样你就可以获得最少量的硬币。 (http://www.geeksforgeeks.org/dynamic-programming-set-7-coin-change/

所以: 动态:

  • 始终准确
  • 更难

贪婪:

  • 直向前
  • 并不总是准确的(猜猜为什么只有1美元,2美元,5美元,这些乘以10:D)