饥饿的牛
题目描述牛在饲料槽前排好了队。饲料槽依次用1到N(1<=N<=2000)编号。每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料。
约翰提供B个区间的清单。一个区间是一对整数start-end,1<=start<=end<=N,表示一些连续的饲料槽,比如1-3,7-8,3-4等等。牛可以任意选择区间,但是牛选择的区间不能有重叠。
当然,牛希望自己能够吃得越多越好。给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西。
在下面的例子中,1-3和3-4是重叠的;聪明的牛选择{1-3,7-8},这样可以吃到5个槽里的东西。
输入
第一行,整数B(1<=B<=1000)
第2到B+1行,每行两个整数,表示一个区间,较小的端点在前面。
输出仅一个整数,表示最多能吃到多少个槽里的食物。
样例
输入
3
1 3
7 8
3 4
样例
输出
5
DP题,源代码:
#include<bits/stdc++.h>
using namespace std;
int n,xxr,b[11110];
struct node
{
int x,y,z;
} a[11110];
int xzr(node a,node b)
{
return a.y<b.y;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i].x>>a[i].y;
a[i].z=a[i].y+1-a[i].x;
}
sort(a+1,a+n+1,xzr);
for(int i=1; i<=n; i++)
{
b[i]=a[i].z;
if(xxr<b[i]) xxr=b[i];
}
for(int i=1; i<=n; i++)
{
int k=0;
for(int j=1; j<i; j++) if(a[i].x>a[j].y&&k<b[j]) k=b[j];
b[i]=b[i]+k;
if(xxr<b[i]) xxr=b[i];
}
cout<<xxr<<endl;
return 0;
}