区间覆盖问题 贪心

本文探讨了如何使用贪心算法解决区间覆盖问题。通过分析区间覆盖问题的描述,提出了选择结束点最早且不相互覆盖的区间策略,并讨论了两种不同的实现方式:一种按右端点排序选择,另一种按左端点降序排序并选择右端点小于等于当前左端点的区间。
摘要由CSDN通过智能技术生成

区间覆盖问题

转载连接::

1. 在解决区间覆盖问题之前我们需要清楚一个概念,那就是贪心的概念,使用贪心的方法求解的是一类最优化问题的方法,它总是考虑在当前状态下局部最优(或者较优)的策略,来使全局的结果达到最优(或着较优)显然,如果采取较优而非最优的策略(最优策略不存在或者是很难想到)得到的全局结果也不是最优的,因此我们在使用贪心法来求解最优化问题的时候需要对采取的策略进行验证.

证明的思路一般是数学归纳法或者是反证法,但是在大多数情况下这个证明还是比较难的,但是我们在想到某个策略的时候难以适应理论去证明但是实际上根据我们的生活经验或者其他的信息能够表明可以由局部最优推导出全局最优的时候那么我们就可以使用贪心的策略来进行求解

2. 区间覆盖问题是典型使用贪心策略解决的一类问题,问题描述如下:

给出N个开区间(x,y),从中选择尽可能多的开区间,使得这些开区间两两没有交集,例如对于开区间(1,3)、(2,4)、(3,5)、(6,7),可以选出最多三个区间(1,3)(3,5)(6,7),他们互相之间没有交集

思路分析:

① 首先我们可以想区间的左端点越往前面那么有可能多的开区间不相交,但是我们仔细一下发现并不是这样的,因为假如一个区间左端点很靠前但是它的长度很长,在这个区间范围内包含了其他几个区间那么这样的贪心策略便是错误的,因为我们可以选择被当前区间覆盖的区间从而使得不相交的区间是最多的

② 除了开始区间之外我们还可以往结束区间上去想,假如结束的区间越往前那么不相交的区间是最多的,因为它越早结束那么可以让后面的区间的左端点可以尽可能多所以这个策略应该是正确的,但是很难去证明这个策略本身的正确性,但是我们可以发现这样做确实是可行的

③ 区间因为涉及到左右两个端点所以需要使用结构体来表示,排序可以使用C++中algorithm中的sort函数进行排序,里面传入一个自定义比较规则的函数

④  经过上面的思考之后那么我们可以对区间的右端点进行排序,假如右端点一样那么取左端点较小的那个区间,所以可以写出下面的代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct Interval{
   
	int x, y;
}I[maxn];
 
int cmp(Interval a, Interval b
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值