我正在从codeforces解决一个问题。
我们的工作是找到使给定整数序列成为非递减序列的最小成本。我们可以在每一步将任意数量的序列增加/减少 1,它将花费 1。
例如,当我们给定一个序列 3, 2, -1, 2, 11,我们可以使该序列不以成本 4 递减(通过递减3
到2
和递增-1
到2
,所以非递减序列将是 2, 2 , 2, 2, 11)
根据这个问题的编辑,我们可以用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
我理解这种重复。但是,我不知道为什么我们应该将原始序列与排序后的序列本身进行比较,并且我不确定我们是否可以使用另一个序列而不是给定序列的排序序列来获得正确的最小成本。
我们如何证明这个解决方案的正确性?我们如何保证排序后的答案是最小成本?