题目背景:
你是一位旅行爱好者,你要到青岛旅游,你的家很富有,所以你来旅游干什么事都很奢侈
题目描述:
你有n所准备选取的酒店,每个酒店都有两个值:服务值、环境值。第i所酒店的服务值、环境值分别为l[i],r[i],你要选取k所酒店。设i,j(0<i<j<n),使得l[i]>=l[j]并且r[i]>=r[j],求k的最大值
输入格式:
第一行一个数字n,接下来n行每行有两个整数l[i],r[i]
输出格式:
一个数k
输入输出样例1
输入: 输出:
3 3
1 3
2 4
3 5
输入输出样例2
输入: 输出:
5 4
3 5
2 4
7 6
4 5
3 6
数据范围
1<=n<=1e3,i<=l[i],r[i]<=1e18
提示
将l[i]的值从小到大排列,再用r[i]的值做最长不上升子序列
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+10;
struct stu//建立酒店的数值
{
int l,r;
}a[N];
int n;
int dp[N];
bool cmp(stu x,stu y)
{
return x.l>=y.l;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i].l>>a[i].r;
sort(a+1,a+n+1,cmp);//将l排序
memset(dp,-0x3f,sizeof(dp));
dp[1]=1;//初始化
for(int i=2;i<=n;i++)//开始动态规划
for(int j=1;j<i;j++)
if(a[i].r<=a[j].r)
dp[i]=max(dp[i],dp[j]+1);
int k=0;//取最大值
for(int i=1;i<=n;i++)
k=max(k,dp[i]);
cout<<k<<endl;
return 0;
}