NKOJ1066 饥饿的奶牛 [DP]

NKOJ1066 饥饿的奶牛 [DP]

问题描述

John养了若干奶牛,每天晚上奶牛都要进食。由于条件比较简陋,并不一定所有奶牛都能吃到食物。奶牛的进食方式是这样的:John有m个食桶(1<=m<=2000),分别编号为1..m。这些食桶被按照编号排成一行。John将奶牛们分成若干组,每组奶牛总是呆在一起进食的,每组奶牛会提出要求——他们需要吃第start到第end桶中的食物。可能存在若干组奶牛都要吃同一个桶中的食物,从而就产生了冲突,这时John只能满足其中一组的要求,另一些组就只能饿肚子了。
John当然不想让奶牛都饿肚子,所以他希望根据奶牛们提出的请求,满足其中一些组的要求,使得最多的食桶被奶牛食用。这个难题困扰着John,他希望得到你的帮助。

输入格式

第一行一个整数n,表示奶牛的组数。(1<=n<=1000)
第2~n+1行,每行两个整数start和end,描述了一组奶牛提出的请求。

输出格式

一个整数,表示最多有多少个食桶可以被食用。

解法

千万不要用贪心!

背包DP,f[i]表示前i个食桶中最多能被使用的食桶数量。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[2100];
struct node{int s,e;}in[1100];
int main(){
    int n,R=0;scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&in[i].s,&in[i].e);
        R=max(R,in[i].e);
    }
    for(int i=1;i<=R;i++){
        f[i]=f[i-1];
        for(int j=1;j<=n;j++)
            if(in[j].e<=i)f[i]=max(f[i],f[in[j].s-1]+in[j].e-in[j].s+1);
    }
    printf("%d",f[R]);
}

猜你喜欢

转载自blog.csdn.net/arliastark/article/details/80719927