【问题描述】
John养了若干奶牛,每天晚上奶牛都要进食。由于条件比较简陋,并不一定所有奶牛都能吃到食物。奶牛的进食方式是这样的:John有n个食桶(1<=n<=2000),分别编号为1..n。这些食桶被按照编号排成一行。John将奶牛们分成若干组,每组奶牛总是呆在一起进食的,每组奶牛会提出要求——他们需要吃第start到第end桶中的食物。可能存在若干组奶牛都要吃同一个桶中的食物,从而就产生了冲突,这时John只能满足其中一组的要求,另一些组就只能饿肚子了。
John当然不想让奶牛都饿肚子,所以他希望根据奶牛们提出的请求,满足其中一些组的要求,使得最多的食桶被奶牛食用。这个难题困扰着John,他希望得到你的帮助。
【输入文件】
从文本文件hunger.in中读入数据。
第一行一个整数n,表示奶牛的组数。(1<=n<=1000)
第2~n+1行,每行两个整数start和end,描述了一组奶牛提出的请求。
【输出文件】
一个整数,表示最多有多少个食桶可以被食用。
【输入输出样例】
输入:
3
1 3
7 8
3 4
输出:
5
(满足第1组和第2组奶牛的要求,这样1~3号和7~8号这5个食桶可以被食用)
【参考程序】:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int x,y;
} a[1001];
int f[2001];
int n;
int main()
{
freopen("hunger.in","r",stdin);
freopen("hunger.out","w",stdout);
scanf("%d",&n);
int max=-1;
for (int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].x,&a[i].y);
if (a[i].y>max) max=a[i].y;
}
memset(f,0,sizeof(f));
for (int i=1;i<=max;i++)
{
f[i]=f[i-1];
for (int j=1;j<=n;j++)
if (a[j].y==i)
if (f[a[j].x-1]+a[j].y-a[j].x+1>f[i])
f[i]=f[a[j].x-1]+a[j].y-a[j].x+1;
}
printf("%d\n",f[max]);
return 0;
}