问题 E: 最长上升字串
时间限制: 3 Sec 内存限制: 128 MB
上一题下一题状态
题目描述
给定n个整数,对其进行m次查询。每次查询是一个范围l到r,求出l到r的最长上升连续子串。上升连续子串的定义为一个连续的子串且严格递增。
输入
第一行是一个整数T,代表测试数据的组数。每组数据中第一行是一个整数n,m,代表有一共有n个人,m个查询。第二行共有n个整数,接下来m行是m次查询,每行两个整数l,r。
输出
共T行,每行m个整数,代表最长上升连续字串。其中T<=50,m<1e5,每个数的大小不超过1e9。
样例输入
1
4 2
3 2 4 5
1 3
1 4
样例输出
2 3
思路:最长上升子序列+区间只差+1
#include<iostream>
#include<algorithm>
using namespace std;
int a[1000],dp[1000];
int t,n,m;
int main()
{
cin>>t;
while(t--){
int l,r;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[j]<a[i]){
dp[i]=max(dp[i],dp[j]+1);
}
}
}
for(int i=0;i<m;i++){
cin>>l>>r;
// cout<<dp[l]<<" "<<dp[r]<<endl;//dp区间之差
cout<<dp[r]-dp[l]+1<<" ";
}
}
}