删数问题的贪心策略正确性证明
这篇文章是从我的另外一篇文章:基础算法:贪心中分离出来的。
因为证明过程比较长。。。
详细内容欢迎看原文章。
设集合\(A\)中有\(n\)个元素,将其中每个元素进行编号为\(a_x\) \(\left ( x\in \left [ 1,n \right ] \right )\) :
1.若\(A\)是一条递增序列,则删除最后一个数,其代表的数值\(S_A\)最小。
首先,将\(S_A\)通过\(A\)表示:
若删去最后一个数,序列\(A\)变为\(A'\),记新表示的数为\(S_{A'}\),则:
若所删除的数,不是最后一个数\(a_n\),而是任意一个数\(a_q\),序列\(A\)变为\(A''\),记新表示的数为\(S_{A''}\),则:
然后观察两式,可以看出来:\(S_{A'}\) 与\(S_{A''}\)前\(q\)项是相同的,故作差:
因为,序列\(A\)是递增的,所以:
即:
所以:\(S_{A'}-S_{A''}\leq0\),所以\(S_{A'} \leq S_{A''}\)
所以,若\(A\)是一条递增序列,则删除最后一个数,其代表的数值\(S_A\)最小。
2.若\(A\)是一条递减序列,则删除第一个数,其代表的数值\(S_A\)最小。
证明方法与 1 同理。
3.由1,2可以猜想:如果\(A\)中存在\(a_1-a_i\)为单调增,\(a_{i+1}-a_n\)为单调减。
单调增的部分,应该删去最后一个数。单调减的部分,应该删去最初一个数。
我们会发现,这两个结论其实是统一的:如下图,应该删去折点所表示的数,也就是“山峰”。
如果我们删除一个数\(a_q\),位于\(a_q\)之前的数就会往后一位,得到\(S_{A'}\)
如果我们删除“山峰”\(a_i\),位于\(a_i\)之前的数就会往后一位,得到\(S_{A''}\)
对比两图可以发现:\(S_{A''}-S_{A'}\)后,黄颜色框中的部分便消去了。即得到与 1证明 中类似的差值。
即\(S_{A''}\leq S_{A'}\)。
所以,若\(A\)不存在单调性,则删除“山峰”,其代表的数值\(S_A\)最小。