caioj 1078 dp

題目描述

【問題描述】

有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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章