**
先把题目贴一贴:
描述describe:
牛在饲料槽前排好了队。饲料槽依次用 11 到 N(1\le N \le 2000)N(1≤N≤2000) 编号。每天晚上,一头幸运的牛根据约翰的规则,吃其中一些槽里的饲料。
约翰提供 NN个区间的清单。一个区间是一对整数 l,r(1\le l \le r \le N)l,r(1≤l≤r≤N),表示一些连续的饲料槽,比如 1-3,7-8,3-41−3,7−8,3−4 等等。牛可以任意选择区间,但是牛选择的区间不能有重叠。
当然,牛希望自己能够吃得越多越好。给出一些区间,帮助这只牛找一些区间,使它能吃到最多的东西。
在上面的例子中,1-31−3 和 3-43−4 是重叠的;聪明的牛选择 {1-3,7-8}1−3,7−8 ,这样可以吃到 55 个槽里的东西。
**
输入scanf
第一行,整数 N(1\le N\le 2000)N(1≤N≤2000)。
第 22 到 N+1N+1 行,每行两个整数,表示一个区间,较小的端点在前面。
输出
仅一个整数,表示最多能吃到多少个槽里的食物。
输入样例
3
1 3
7 8
3 4
输出样例
5
这道题呢,小编A的时候有点凌乱,不过大家也别介意(因为我会给你们找些坑的 )
好了,进入正轨
喔艹
第一次看这道题好变态
要用到
- 数的划分
- 字符串拼接
- 。。。。。。
不过聪明的我还是找到解决办法了
先把前后范围用结构体保存一下
struct node{
int l,r;
};
再写个cmp排序函数
这样我们就有足够的发挥空间了
话不多说,上全局代码
还是那句话Harden MVP!!!
#include<bits/stdc++.h>
using namespace std;
int dp[2010];
struct node{
int l,r;
};
node a[2010];
bool cmp(const node &x,const node &y){
return x.r<y.r;
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&a[i].l,&a[i].r);
}
sort(a+1,a+1+n,cmp);
int ans=dp[1]=a[1].r-a[1].l+1;
for(int i=2;i<=n;i++){
dp[i]=a[i].r-a[i].l+1;
for(int j=1;j<=i-1;j++){
if(a[j].r<a[i].l){
dp[i]=max(dp[i],dp[j]+(a[i].r-a[i].l+1));
}
}
ans=max(ans,dp[i]);
}
printf("%d",ans);
return 0;
}