删数问题的贪心策略正确性证明

这篇文章是从我的另外一篇文章:基础算法:贪心中分离出来的。

因为证明过程比较长。。。

详细内容欢迎看原文章。

设集合\(A\)中有\(n\)个元素,将其中每个元素进行编号为\(a_x\) \(\left ( x\in \left [ 1,n \right ] \right )\) :

\[\begin{aligned} A=\begin{Bmatrix} a_1,&a_2, &a_3, &\cdot &\cdot &\cdot &a_{n-1}, &a_n \end{Bmatrix} \end{aligned} \]

1.若\(A\)是一条递增序列,则删除最后一个数,其代表的数值\(S_A\)最小。

首先,将\(S_A\)通过\(A\)表示:

\[\begin{aligned} S_A=a_1\times 10^{n-1}+a_2\times 10^{n-2}+\cdot \cdot \cdot +a_{n-1}\times10+a_n \end{aligned} \]

若删去最后一个数,序列\(A\)变为\(A'\),记新表示的数为\(S_{A'}\),则:

\[\begin{aligned} S_{A'}=a_1\times 10^{n-2}+a_2\times 10^{n-3}+\cdot \cdot \cdot +a_{n-2}\times10+a_{n-1} \end{aligned} \]

若所删除的数,不是最后一个数\(a_n\),而是任意一个数\(a_q\),序列\(A\)变为\(A''\),记新表示的数为\(S_{A''}\),则:

\[\begin{aligned} S_{A''}=a_1\times 10^{n-2}+a_2\times 10^{n-3}+\cdot \cdot \cdot +a_{q-1}\times10^{n-q}+a_{q+1}\times10^{n-q-1} \cdot\cdot \cdot +a_{n-2}\times10+a_{n-1} \end{aligned} \]

然后观察两式,可以看出来:\(S_{A'}\)\(S_{A''}\)\(q\)项是相同的,故作差:

\[\begin{aligned} S_{A'}-S_{A''}=\left ( a_q-a_{q+1} \right )\times10^{n-q-1}+\left ( a_{q+1}-a_{q+2} \right )\times10^{n-q-2} \cdot\cdot \cdot +\left ( a_{n-2}-a_{n-1} \right )\times10+\left ( a_{n-1}-a_n \right ) \end{aligned} \]

因为,序列\(A\)是递增的,所以:

\[\begin{aligned} a_q\leq a_{q+1}\leq a_{q+2}\cdot \cdot \cdot a_{n+1}\leq a_n \end{aligned} \]

即:

\[\begin{aligned} a_q-a_{q+1}\leq0, a_{q+1}-a_{q+2}\leq0, \cdot \cdot \cdot a_{n+1}-a_n\leq 0 \end{aligned} \]

所以:\(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\)为单调减。

单调增的部分,应该删去最后一个数。单调减的部分,应该删去最初一个数。

我们会发现,这两个结论其实是统一的:如下图,应该删去折点所表示的数,也就是“山峰”。

dnOXmq.png

如果我们删除一个数\(a_q\),位于\(a_q\)之前的数就会往后一位,得到\(S_{A'}\)

duE8k4.png

如果我们删除“山峰”\(a_i\),位于\(a_i\)之前的数就会往后一位,得到\(S_{A''}\)

对比两图可以发现:\(S_{A''}-S_{A'}\)后,黄颜色框中的部分便消去了。即得到与 1证明 中类似的差值。

duEGtJ.png

\(S_{A''}\leq S_{A'}\)

所以,若\(A\)不存在单调性,则删除“山峰”,其代表的数值\(S_A\)最小。

posted @ 2020-08-18 13:15  x_miracle  阅读(1125)  评论(1编辑  收藏  举报