饥饿的奶牛(不重区间最大值)

牛在饲料槽前排好了队。饲料槽依次用1到N(1N2000)编号。每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料。

约翰提供BB个区间的清单。一个区间是一对整数startend1≤start≤end≤N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等。牛可以任意选择区间,但是牛选择的区间不能有重叠。

当然,牛希望自己能够吃得越多越好。给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西。

在上面的例子中,1-3和3-4是重叠的;聪明的牛选择{1-3,7-8},这样可以吃到5个槽里的东西。

Input

第一行,整数BB(1B1000
第二行到B+1行,每行两个整数,表示一个区间,较小的端点在前面。 

Output

一个整数,表示最多能吃到多少个槽里的食物。

Samples

Input Copy
3
1 3
7 8
3 4
Output
5

01背包
#include <iostream>
#include<algorithm>
using namespace std; 
const int maxn=1e6+100;
struct node{
    int l,r;
}a[maxn];
int dp[maxn];
int p;    
int n;
bool cmp(node x,node y){
    return x.r<y.r;
}
void inint(){
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d%d",&a[i].l,&a[i].r);    
    }
}
int main(){
    inint();
    sort(a+1,a+n+1,cmp);
    p=a[n].r;
    for(int i=1;i<=n;i++){
        for(int j=p;j>=a[i].r;j--){
            dp[j]=max(dp[j],dp[a[i].l-1]+(a[i].r-a[i].l+1));
        }
    } 
    cout<<dp[p]<<endl;
}

 

posted @ 2021-01-29 22:54  lipu123  阅读(98)  评论(0编辑  收藏  举报