饥饿的奶牛
这个题中在点上加入了线段的概念,不过此题长时间不过,居然是因为,我将结构体排序之前的值赋给了动规数组,而正解是结束后才赋值,所以错了一晚上,一晚上
贴代码
#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);
}

浙公网安备 33010602011771号