数学归纳法证明贪心实例
将描述更正了一下,更正后的描述更严谨,但是只更正了第一个,剩下的还没有修
1.选择不相交区间问题(具体见一本通提高篇P4)
假设已经选择的区间是最优的方案的一部分,即我们可以通过已经选择的区间构造出最优解,下面考虑如何选择会使方案达到最优。
显然,由于我们可以通过已经选择的区间构造出最优解,所以当我们扫描到的区间与已经选择的区间之间相交的时候,就不用考虑当前扫描到的区间了,于是考虑下一个最早的合法的区间A
因为是按照结束时间升序排序的,如果我们不选择当前这一个合法的,而是去选择之后的合法的(设为B),那么无论最后的方案是怎样的,都可以将B换成A从而符合题意。
由数学归纳法,最开始一个都没有选的时候可以看作是最优方案的一部分,因此算法正确
2.区间选点问题(具体见一本通提高篇P6)
假设已经选择的点和被覆盖的区间是最优的方案的一部分(注意我们是按照区间考虑的),下面考虑如何选择会使方案达到最优。
首先是一个前提:如果一个区间(设为A)在被考虑之前已经被若干个点给覆盖了,那么就不用再考虑主动在这个区间上放点了。
因为是按照结束位置升序排序的,对任意一个被考虑主动放点的区间(此时这个区间前面的区间都已经被覆盖了哈,不用考虑了),点都是放在此区间的右端点处最好。若此时还要考虑A,显然没有考虑后面的未被覆盖的区间优(决策包容性,因为是按照结束位置升序排序)
对于当前的状态,我们显然是选择第一个未被覆盖的区间更优(决策包容性),不会再去考虑放弃当前的而去选后面的
由数学归纳法,最开始一个点都没有的时候可以看作是最优方案的一部分,因此算法正确
3.区间覆盖问题(具体见一本通提高篇P9)
假设从左到右已经覆盖了一段指定区间了且选择的区间是最优的方案的一部分,下面考虑如何选择会使方案达到最优。
由决策包容性易得,已经被覆盖的指定区间就不用在考虑了,因此一本通直接将
由数学归纳法,最开始一个点都没有被覆盖的时候可以看作是最优方案的一部分,因此算法正确
4.acwing110防晒
我们按照我们的代码证明,即按照maxspf递增排序,每次选择spf最小的使用
假设当前选择已经是最优的一部分了,我们考虑最新的一头奶牛,这一头奶牛能够找到至少一瓶防晒霜使其被选择。如果最优的方案没有选择这头奶牛,那我们考虑这一瓶防晒霜,如果在这个方案中没被使用,那我给这头奶牛肯定更优,如果被使用了,我把这瓶防晒霜给这头奶牛答案不变,所以最优方案一定会选择这头奶牛。如果给这头奶牛的防晒霜不是spf最小的,那么就可能这样:[ 0 【 0 ] 】,其中0代表防晒霜,如果选择的是spf最小的,那么如果存在一种更优的方案使得不选spf最小的,那么这个spf最小的一定被另一头奶牛用了(不然的话我就可以让这头奶牛选这个spf最小的),此时我们交换这两头奶牛的防晒霜显然都是符合题意的且答案不变,所以这个方案不是更优的,所以得证
如果按照minspf递增排序,每次选择spf最小的防晒霜的问题出现在哪里?实际上,出现在“无法交换”
假设我们已经得到了最优方案的一部分,当前正在考虑的这头奶牛,如果他能涂那我们选择哪一瓶?感觉应该选择spf最小的(设为
而其他的构造方法用数学归纳法证明的时候都是“可以交换的”
我们也可以换一个对象考虑,考虑防晒霜
4.带限期和罚款的单位时间任务调度
跟上面差不多,不妨证明一下
input:aaabc
output:abaca
做法:统计每个字母的频率,设已经构建好了的字符串为
证明:假设当前已经通过上述算法构造好了
当然官方的做法是跟LOG很像,具体见下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构