数学归纳法证明贪心实例

1.选择不相交区间问题(具体见一本通提高篇P4)
假设已经选择的区间是最优的方案的一部分,下面考虑如何选择会使方案达到最优。
因为是按照结束时间升序排序的,如果我们不选择当前这一个合法的(设为A)而是去选择之后的合法的(设为B),那么无论最后的方案是怎样的,都可以将B换成A从而符合题意。
由数学归纳法,最开始一个都没有选的时候可以看作是最优方案的一部分,因此算法正确

2.区间选点问题(具体见一本通提高篇P6)
假设已经选择的点和被覆盖的区间是最优的方案的一部分(注意我们是按照区间考虑的),下面考虑如何选择会使方案达到最优。
首先是一个前提:如果一个区间(设为A)在被考虑之前已经被若干个点给覆盖了,那么就不用再考虑主动在这个区间上放点了。
因为是按照结束位置升序排序的,对任意一个被考虑主动放点的区间(此时这个区间前面的区间都已经被覆盖了哈,不用考虑了),点都是放在此区间的右端点处最好。若此时还要考虑A,显然没有考虑后面的未被覆盖的区间优(决策包容性,因为是按照结束位置升序排序)
对于当前的状态,我们显然是选择第一个未被覆盖的区间更优(决策包容性),不会再去考虑放弃当前的而去选后面的
由数学归纳法,最开始一个点都没有的时候可以看作是最优方案的一部分,因此算法正确

3.区间覆盖问题(具体见一本通提高篇P9)
假设从左到右已经覆盖了一段指定区间了且选择的区间是最优的方案的一部分,下面考虑如何选择会使方案达到最优。
由决策包容性易得,已经被覆盖的指定区间就不用在考虑了,因此一本通直接将\(s\)更新为右端点坐标(不会在后面了,因为决策包容性)
由数学归纳法,最开始一个点都没有被覆盖的时候可以看作是最优方案的一部分,因此算法正确

4.acwing110防晒
我们按照我们的代码证明,即按照maxspf递增排序,每次选择spf最小的使用
假设当前选择已经是最优的一部分了,我们考虑最新的一头奶牛,这一头奶牛能够找到至少一瓶防晒霜使其被选择。如果最优的方案没有选择这头奶牛,那我们考虑这一瓶防晒霜,如果在这个方案中没被使用,那我给这头奶牛肯定更优,如果被使用了,我把这瓶防晒霜给这头奶牛答案不变,所以最优方案一定会选择这头奶牛。如果给这头奶牛的防晒霜不是spf最小的,那么就可能这样:[ 0 【 0 ] 】,其中0代表防晒霜,如果选择的是spf最小的,那么如果存在一种更优的方案使得不选spf最小的,那么这个spf最小的一定被另一头奶牛用了(不然的话我就可以让这头奶牛选这个spf最小的),此时我们交换这两头奶牛的防晒霜显然都是符合题意的且答案不变,所以这个方案不是更优的,所以得证

如果按照minspf递增排序,每次选择spf最小的防晒霜的问题出现在哪里?实际上,出现在“无法交换”

假设我们已经得到了最优方案的一部分,当前正在考虑的这头奶牛,如果他能涂那我们选择哪一瓶?感觉应该选择spf最小的(设为\(x\)),然而如果这么选,我们来证明不一定最优。假设这头奶牛选择了另一瓶spf更大的(设为\(y\)),然后剩下的防晒霜给后面的奶牛使用并弄出了最优方案,我们能不能够交换\(x\)\(y\)的使用者呢?如果能够交换,那么我们的策略就是正确的(一定能够构造出一种最优方案使得是按照我们的策略构造的)。然而在这里,我们只按照minspf递增排序,可能\(y\)的spf比当前奶牛的maxspf小但是比使用\(x\)的奶牛的spf大,这个时候就不能再交换了,比如[【0】0]。

而其他的构造方法用数学归纳法证明的时候都是“可以交换的”

我们也可以换一个对象考虑,考虑防晒霜

4.带限期和罚款的单位时间任务调度
跟上面差不多,不妨证明一下

posted @ 2023-07-12 23:12  最爱丁珰  阅读(29)  评论(0编辑  收藏  举报