【发布时间】:2013-06-23 02:41:27
【问题描述】:
我正在解决来自codeforces 的问题。
我们的工作是找到使给定整数序列成为非递减序列的最小成本。我们可以在每一步将任意数量的序列增加/减少 1,它将花费 1。
例如,当给定序列 3、2、-1、2、11 时,我们可以使序列不随成本 4 递减(通过将 3 减少到 2 并将 -1 增加到2,所以非递减序列为 2,2,2,2,11)
根据这个问题的editorial,我们可以用2个序列的动态规划来解决这个问题,(一个是给定的序列,另一个是给定序列的排序序列)。
解决方案大纲:
如果我们让a 是原始序列,b 是序列a 的排序序列,并且让f(i,j) 是获得前 i 个元素的序列所需的最小移动次数是非递减的,并且第 i 个元素最多为 bj。然后我们可以如下进行递归。 (这是来自问题的社论)
f(1,1)=|a1-b1|
f(1,j)=min{|a1-bj|,f(1,j-1)}, j>1
f(i,1)=|ai-b1|+f(i-1,1), i>1
f(i,j)=min{f(i,j-1),f(i-1,j)+|ai-bj|}, i>1, j>1
我理解这种重复。但是,我无法弄清楚为什么我们应该将原始序列与已排序的序列本身进行比较,并且我不确定我们是否可以使用另一个序列而不是给定序列的排序序列来获得正确的最小成本。
我们如何证明这个解决方案的正确性?又如何保证排序后的答案成本最低?
【问题讨论】:
标签: algorithm proof proof-of-correctness