codevs 1345 饥饿的奶牛

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;
}
View Code

 

你可能感兴趣的:(codevs 1345 饥饿的奶牛)