1345 饥饿的奶牛
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
题目描述 Description
John养了若干奶牛,每天晚上奶牛都要进食。由于条件比较简陋,并不一定所有奶牛都能吃到食物。奶牛的进食方式是这样的:John有n个食桶(1<=n<=2000),分别编号为1..n。这些食桶被按照编号排成一行。John将奶牛们分成若干组,每组奶牛总是呆在一起进食的,每组奶牛会提出要求——他们需要吃第start到第end桶中的食物。可能存在若干组奶牛都要吃同一个桶中的食物,从而就产生了冲突,这时John只能满足其中一组的要求,另一些组就只能饿肚子了。
John当然不想让奶牛都饿肚子,所以他希望根据奶牛们提出的请求,满足其中一些组的要求,使得最多的食桶被奶牛食用。这个难题困扰着John,他希望得到你的帮助。
输入描述 Input Description
从文本文件hunger.in中读入数据。
第一行一个整数n,表示奶牛的组数。(1<=n<=1000)
第2~n+1行,每行两个整数start和end,描述了一组奶牛提出的请求。
输出描述 Output Description
一个整数,表示最多有多少个食桶可以被食用。
(满足第1组和第2组奶牛的要求,这样1~3号和7~8号这5个食桶可以被食用)
样例输入 Sample Input
3
1 3
7 8
3 4
样例输出 Sample Output
5


/*类似于线段覆盖的题目,不同的是端点不可以重合,但是仍然是要求线段最长*/ #include<cstdio> #include<iostream> using namespace std; struct Group{ int start,end,len; }; #include<algorithm> Group group[1001]; int n; int cmp(Group a,Group b) { return a.end<b.end; } void input() { scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%d%d",&group[i].start,&group[i].end); if(group[i].start>group[i].end) swap(group[i].start,group[i].end); group[i].len=group[i].end-group[i].start+1; } sort(group+1,group+n+1,cmp); } int dp[1001]; void DP() { dp[1]=group[1].len; for(int i=2;i<=n;++i) for(int j=1;j<=i-1;++j) if(group[i].start>group[j].end) dp[i]=max(dp[i],dp[j]+group[i].len); } int main() { input(); DP(); cout<<dp[n]<<endl; return 0; }