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