饥饿的牛


饥饿的牛


题目描述牛在饲料槽前排好了队。饲料槽依次用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;
}

AC


发布了50 篇原创文章 · 获赞 51 · 访问量 1426

猜你喜欢

转载自blog.csdn.net/m0_45682806/article/details/103328289