Divide Set成对元素,这些元素之间的差异最小

时间:2017-09-25 06:44:14

标签: algorithm dynamic-programming partitioning

我需要一个可以帮助我将 N元素数组划分为的算法,每对中的元素必须最小差

1 个答案:

答案 0 :(得分:0)

所以,我假设我们可以扔掉最多1个元素(如果 N 是奇数)。设 a 1 a 2 ≤...≤ a N < / sub>是我们以非递减顺序排序的数字集。设 f k )是第一个 k 数字形成的对内差异的最小可能总和。 (因此,将第一个 k 数字的所有分区最小化成对。)正如在 N 的注释中所提到的,我们只需要逐个获取元素。然后

f (0)= f (1)= 0,

f (2· k )= f (2· k - 2)+( a k - a k - 1 k ≥1和

f (2· k + 1)= min { f (2· k ,f (2· k - 1)+( a k + 1 - a k )} k ≥1。

最后一个公式意味着我们可以丢弃(2· k + 1)元素或者丢弃第一个元素(2· k - 1 )。在剩余的2个 k 元素上,我们应用已知的解决方案,即使是 N

这是一种在排序数字后找到O( N )时间内问题的数字答案的方法,i。即通常,它需要O( N log N )时间。之后,如果您需要将所有数字分成对,只需使用动态编程的后退步骤。对于偶数 N ,只需简单地进行配对。对于奇数 N 扔掉 a N 如果 f N < / em>)= f N - 1)或成对( a N a N - 1 ),否则将 N 减少2。