caioj 1078 dp

来源:互联网 发布:数据挖掘 关联规则 编辑:程序博客网 时间:2024/06/08 05:59

题目描述

【问题描述】

有n条线段(给出起点和末端),分别坐落在数轴上,要求它们之间彼此不重叠的条件下,最大可以覆盖数轴的长度。(数轴的长度指线段覆盖数轴数字的个数)(1~3和3~4的线段视为重叠)

【输入】

    第一行一个整数n(1<=n<=1000)

    第2~n+1行,每行两个整数start和end,描述线段的起点和末端,所有线段都落在[0,2000]的范围内。

【输出文件】

    一个整数,表示最多覆盖数轴的长度。


第一次秒题!。

按起点排序后直接从前面找能转移过来的状态。

取max即可。

事实证明手打快排真的不好

#include<cstdio>#include<algorithm>using namespace std;struct edge{int l,r;}p[2001];int n,f[2001];//void qsort(int x,int y)//{//int i=x,j=y,k=l[(i+j)/2];//while (i<=j)//{//while (l[i]<k) i++;//while (l[j]>k) j--;//while (i<=j)//{//int t;//t=l[i];l[i]=l[j];l[j]=t;//t=r[i];r[i]=r[j];r[j]=t;//i++;j--;//}//}//if (i<y) qsort(i,y);//if (x<j) qsort(x,j);//}int cmp(edge x,edge y){if(x.l==y.l) return x.r<y.r;return x.l<y.l;}int main(){scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d%d",&p[i].l,&p[i].r);}sort(p+1,p+n+1,cmp);for (int i=1;i<=n;i++)f[i]=p[i].r-p[i].l+1;for (int i=1;i<=n;i++)for (int j=1;j<=i-1;j++){if (p[j].r<p[i].l) f[i]=max(f[i],f[j]+p[i].r-p[i].l+1);}int max1=0;for (int i=1;i<=n;i++)max1=max(max1,f[i]);printf("%d",max1);return 0;}