饥饿的奶牛

这个题中在点上加入了线段的概念,不过此题长时间不过,居然是因为,我将结构体排序之前的值赋给了动规数组,而正解是结束后才赋值,所以错了一晚上,一晚上

贴代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=150003;
//洛谷上的p1868, 但是由于数据范围较大 所以是贪心做法 
int n,f[maxn];
struct qj{
	int l,r,s;
}q[maxn];

bool cmp(const qj &a,const qj &b)
{
	return a.l<b.l;
}

int main()
{
	int ans=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].s=q[i].r-q[i].l+1;
	}
	sort(q+1,q+1+n,cmp);//按照开始时间进行排序
	for(int i=1;i<=n;i++)
		f[i]=q[i].s; 
	for(int i=2;i<=n;i++)
		for(int j=1;j<=i-1;j++)
			if(q[i].l>q[j].r) f[i]=max(f[i],f[j]+q[i].s);//保证了两个集合不相交 	
	//这里是必须的,有的时候f[n]不一定是最大的	
	for(int i=1;i<=n;i++)
	  if (f[i]>ans) ans=f[i];
	printf("%d",ans);
}

 

posted @ 2017-08-02 22:21  xinyimama  阅读(84)  评论(0编辑  收藏  举报