[英]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.