区间的贪心问题

区间的问题在竞赛中经常出现,而在这些问题中,有的可以用贪心解决.

例如:给出总共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;}
}

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/79387804