“删数问题”是指给定一个数字串,通过删除其中的一些数字(保持剩余数字的相对顺序不变),得到一个新的数字,使得这个新的数字尽可能小。证明贪心选择性质需要使用反证法。
题目设定与贪心策略
设原始数字串为 S=s1,s2,…,snS = s_1, s_2, \dots, s_nS=s1,s2,…,sn,需要删去 kkk 个数字,剩下的数字构成的数尽可能小。贪心策略是:从左到右扫描数字,尽可能优先删除当前导致数值最大的数字。
目标
证明上述贪心策略满足贪心选择性质,即:假设最优解不包含贪心选择,则可以通过替换最优解的一部分,使其包含贪心选择,并且得到的数不比最优解大(即更优或等价)。
证明
1. 假设
设贪心算法选择删除了一个数字 sis_isi,得到部分结果数字串 SgreedyS_{greedy}Sgreedy,而存在一个最优解 SoptimalS_{optimal}Soptimal,SoptimalS_{optimal}Soptimal 没有删除 sis_isi。我们需要证明 SoptimalS_{optimal}Soptimal 不可能比 SgreedyS_{greedy}Sgreedy 更优。
2. 转换
根据贪心策略,sis_isi 是删除序列中第一个(从左到右)比后续数字更大的数,或者是数字串中当前局部最大值。例如:
- 如果 si>si+1s_i > s_{i+1}si>si+1,贪心选择删除 sis_isi。
- 若 SoptimalS_{optimal}Soptimal 没有删除 sis_isi,则在 SoptimalS_{optimal}Soptimal 中,sis_isi 必须保留,而后续某处(如 sjs_jsj)会删除一个不同的数字。
用 Soptimal′S_{optimal}'Soptimal′ 表示通过替换删除 sis_isi 而构造的新的最优解。需要证明 Soptimal′S_{optimal}'Soptimal′ 不会比 SoptimalS_{optimal}Soptimal 更差。
3. 观察
由于 si>si+1s_i > s_{i+1}si>si+1,删除 sis_isi 会使剩余数字串更小(即更优)。而 SoptimalS_{optimal}Soptimal 保留了 sis_isi,则删除后续数字(如 sjs_jsj)可能导致前缀数值更大:
- SgreedyS_{greedy}Sgreedy 的前缀较小,因为删掉了 sis_isi。
- SoptimalS_{optimal}Soptimal 的前缀较大,导致整体数值不可能小于 SgreedyS_{greedy}Sgreedy。
4. 矛盾
因此,如果 SoptimalS_{optimal}Soptimal 不包含贪心选择,则一定存在一种调整方案(删除 sis_isi,而不是后续的某个数字),使得新的结果 Soptimal′S_{optimal}'Soptimal′ 至少与 SoptimalS_{optimal}Soptimal 等价(或更优)。
这与假设 SoptimalS_{optimal}Soptimal 比 SgreedyS_{greedy}Sgreedy 更优矛盾。
结论
通过反证法证明,删除当前导致数值最大的数字(即贪心选择)必然是最优解的一部分。因此,“删数问题”满足贪心选择性质。