动态规划最优“非递减序列”

时间:2017-10-05 14:31:21

标签: arrays algorithm dynamic-programming

问题是,

给定具有N个整数的数组A,输出使序列不减少所需的最小操作数。

操作表示在数组A [i]中选择一个数字,将其相加为A [i + 1]或A [i - 1],并删除A [i]

问题的链接(西班牙语):https://omegaup.com/arena/problem/Torres#problems

示例:

3
5 2 1

Answer: 2

在这种情况下,我们必须加入所有数字,将序列转换为{8},这是非去世的

限制:

N <= 5000
A[i] <= 10^5

我认为这个问题可以通过DP来解决,但是我无法找到能够以一种小而正确的方式表示问题的状态。

提前致谢。

1 个答案:

答案 0 :(得分:0)

编辑:我错了。。以下算法无法解决问题。

可以从左到右进行一次线性扫描。让我解释一下我的推理:

如果您加入两个号码A[i]A[i+1],则结果大于A[i]。如果A [i]左边的部分已经非递减,则A[i] < A[i-1]需要执行此操作。

不必要地加入A[i]A[i+1]会消耗一项操作并使加入更加困难,所以我们只在必要时才这样做。

  • 如果A[i] < A[i-1],请加入A[i]A[i+1],直到A[i] >= A[i-1]
  • 如果A[i] >= A[i-1],请递增i。

P.S。原始问题说明指出A[i]位于1...10^5范围内,因此明确排除负数,这对算法很重要。