先將題目給出的\(b\)轉化為單調不降序列。具體來說,對題目給出的原序列\(a\),每個位置都減去其下標得到\(a^{'}\);對任意一種構造的\(b\),也都減去其下標得到\(b^{'}\),顯然\(\overset{n}{\underset{i=1}{\sum}}|a_i-b_i|=\overset{n}{\underset{i=1}{\sum}}|(a_i-)-(b_i-i)|=\overset{n}{\underset{i=1}{\sum}}|a^{'}_i-b^{'}_i|\);下文都以\(a,b\)指代\(a^{'},b^{'}\),並設\(c[i][j]\)表示\(a\)中的\(i\) ~ \(j\)排好序之後的陣列(也就是說\(c\)是一個三維陣列)
問題一:如果知道了對於\(a\),最好的構造的\(b\)都是相同的(即\(b_1=b_2=...=b_n\)),那麼\(b\)的值應該為什麼?
答:顯然為貨倉選址問題,\(b\)取\(a\)的中位數(如果\(n\)為偶數,任取一個數都可以)
問題二:如果知道了對於\(a\),存在一個下標\(k\),使得\(1\) ~ \(k\)的最佳構造的\(b\)相同(i.e.當\(b_1=b_2=...=b_k\)時,\(\overset{k}{\underset{i=1}{\sum}}|a_i-b_i|\)最小)且\(k+1\) ~ \(n\)的最佳構造的\(b\)相同(i.e.當\(b_{k+1}=b_{k+2}=...=b_n\) 時,\(\overset{n}{\underset{i=k+1}{\sum}}|a_i-b_i|\)最小),是否可以構造出整個\(a\)的最佳構造,如果可以,如何構造?
答:可以構造出來。不妨設\(b_1=v_1,b_{k+1}=v_2\)
如果說\(v_1\leq v_2\),那麼整個\(a\)的最佳構造\(b\)就是\(b_1=b_2=...=b_k=v_1,b_{k+1}=...=b_n=v_2\),這是因為\(\overset{n}{\underset{i=1}{\sum}}|a_i-b_i|=\overset{k}{\underset{i=1}{\sum}}|a_i-b_i|+\overset{n}{\underset{i=k+1}{\sum}}|a_i-b_i|\),兩者剛好取到下界且滿足\(b\)單調不降
如果說\(v_1>v_2\),考慮一個最優構造\(b\),如果說\(b_k>v_1\),我們將\(b\)的前\(k\)個數全部變成\(v_1\),顯然滿足單調不降而且答案不會更差;否則的話,此時已經有\(b_k\leq v_1\),如果此時還有\(b_{k+1}<v_2\),我們將\(b_{k+1},b_{k+2},...,b_n\)全部改成\(v_2\),顯然滿足單調不降且答案不會更差。也就是說一定存在一組最優解,使得\(b_k\leq v_1,b_{k+1}≥v_2\)。接下來考慮\(b\)的前\(k\)個數。假設\(b\)現在長成這個樣子:
我們將除了最後一段\(b\)的剩下的\(b\)整體向上移動到倒數第二段\(b\)與最後一段\(b\)相同,如下
此過程答案一定不會更差。這是因為:設(移動前)最後一段\(b\)的下標為\(p+1\) ~ \(k\),那麼對於前\(p\)個數來說,\(c[1][p]_{\lfloor\frac{p}{2}\rfloor+1}\)(也就是\(a\)的前\(p\)個數的中位數,想一下為什麼\(c\)的下標一定是\(\lfloor\frac{p}{2}\rfloor+1\)而不能是其他的)一定不會低於\(v_1\)(否則的話\(b\)的前\(p\)個數的取值不會是\(v_1\),而是\(c[1][p]_{\lfloor\frac{p}{2}\rfloor+1}\),這樣答案肯定嚴格更優秀,就與我們的假設矛盾了),也就是說\(a\)的前\(p\)個數至少有\(\lfloor\frac{p}{2}\rfloor\)個數不低於\(v_1\),而上面的移動讓\(b\)的前\(p\)個數更加接近\(v_1\),於是\(\overset{k}{\underset{i=1}{\sum}}|a_i-b_i|\)增加的值一定不會超過減少的值。推而廣之,最後我們可以將\(b\)的前\(p\)個數變成相同的值,為\(b_k\)。此時我們不再考慮\(b_k\)後面的\(b\),只考慮\(b\)的前\(k\)個數(也就是暫時先不管整個\(b\)的單調不降),將這\(k\)個數往\(v_1\)整體移動,顯然答案也不會變差
對於\(b_k\)後面的\(b\),我們也可以類似地證明,可以將所有的\(b\)都變成\(b_{k+1}\)並且可以再整體往\(v_2\)靠近;這樣的話,我們就可以最終將\(b\)整體變成一樣的值(注意最開始有\(b_k\leq b_{k+1}\)),並且答案不會更差
也就是說,對於整個\(a\)來說,存在一個最優解\(b\)使得所有\(b\)的值相同;由於當\(b\)全部取\(a\)的中位數的時候,是在滿足“\(b\)的值都相同”的前提下,答案最小的解,所以這就是在滿足“\(b\)的值都相同”的前提下的下界,而我們肯定可以達到這個下界,於是構造完畢
有了上面兩個問題做鋪墊,我們來考慮原問題。注意原問題是滿足子問題最優性的。
假設現在已經構造好了前\(i\)個數的最優解,對於\(a_{i+1}\),如果\(a_{i+1}≥b_i\),那麼\(b_{i+1}=a_{i+1}\),從而找到了前\(i+1\)個數的最優解;否則的話,我們令\(b_i=b_{i+1}=\text{mid}\),其中\(\text{mid}\)是\(a_i,a_{i+1}\)的中位數,這樣的話就找到了在前\(i-1\)個\(b\)不變的情況下的最優解。一直重複上述操作直到一個下標\(q\)(不能再繼續操作了),現在\(b\)的前\(q\)個數是我們之前已經構造好了的數,同時也是使得\(\overset{q}{\underset{j=1}{\sum}}|a_j-b_j|\)最小的構造(原問題滿足子問題最優性),\(b_q\)後面的數的值都相同,為\(a_q\)後面的數的中位數,顯然此時也有\(\overset{i}{\underset{j=q+1}{\sum}}|a_j-b_j|\)最小,於是原問題就取到了下界