区间的问题在竞赛中经常出现,而在这些问题中,有的可以用贪心解决.
例如:给出总共n个的线段,让它们不相交(一个点不算),求最多能取几个线段.
这道题都能想到一个不完美的贪心:对这些区间以左端点为第一标准,以右端点为第二标准从小到大排序,之后从后往前能选就选.
可是这明显是错的.
例如这个数据:
1 3
3 4
2 2
如果用上面的方法,答案就是1,然而其实是2.
所以我们换个方法,按照右端点为第一标准,左端点为第二标准,从小到大排序,之后能取就取.
这就是正确的.
为什么?
这题用了DP的思想,每一次搜到某个区间的时候,当前最优解就代表搜到这个区间的最优解.
那么f[i]=max(max(f[j]),max(f[k]+1)) (j<i,e[j].r>=e[i].l)(e[k].r<e[i].r)
那么我们可以知道:这种情况下,最左边的选法一定最大.
所以很简单.
代码如下:
inline void work(){ sort(a+1,a+1+n,cmp); int k=a[n].x-1; for (int i=n;i>=1;i--) if (a[i].x>=k) {s++;k=a[i].y;} }