【问题标题】:How to prove correctness of this algorithm?如何证明这个算法的正确性?
【发布时间】: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


    【解决方案1】:

    练习的重点是可以用归纳法证明这种复发。一旦被证明,那么我们已经证明f(n,n) 是结束解决方案的最低成本,其中nth 的值最多为bn

    要完成证明结果,还有一步。这是为了证明nth 值超过bn 的任何解决方案都可以在不增加最大值的情况下得到改进。但这是微不足道的 - 只需从第一个值中省略一个 +1 以超过 bn,您就有了一个更好的解决方案,而没有更大的最大值。因此,最大值大于bn 的解决方案不会比最大值至多bn 的最佳解决方案更好。

    因此我们有最优解。

    【讨论】:

      猜你喜欢
      • 2022-10-25
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多