[英]How to prove correctness of this algorithm?
我正在从Codeforce解决问题。
我们的工作是找到使给定的整数序列成为非递减序列的最小成本。 我们可以在每一步将任意数量的序列增加/减少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个元素是非递减和我-th个元素最多为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
我知道这种复发。 但是,我无法弄清楚为什么我们应该将原始序列与排序后的序列进行比较,并且我不确定是否可以使用给定序列的排序序列以外的其他序列来获得正确的最小成本。
我们如何证明该解决方案的正确性? 我们如何保证排序顺序的答案是最小的成本?
练习的重点是可以通过归纳证明这种复发。 一旦证明,则我们证明f(n,n)
是第n
个值最多为bn
的解决方案的最小成本。
要完成对结果的证明,还有一个步骤。 这证明了第n
个值超过bn
任何解决方案都可以得到改进,而无需增加该最大值。 但这是微不足道的-只需从第一个值中bn
+1中的一个以超过bn
,就可以得到一个严格更好的解决方案,而没有一个更大的最大值。 因此无解大于最大清盘bn
可以比最好至多最大更好bn
。
因此,我们有最佳的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.