题目描述
牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。
输入描述:
输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 10^5),即数列的长度;
第二行n个整数a_i, 表示数列中的每个数(1 ≤ a_i ≤ 10^9),以空格分割。
输出描述:
输出一个整数,表示最长的长度。
示例1
输入
6
7 2 3 1 5 6
输出
5
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+100;
int l[N],r[N],a[N];//正向连续递增,反向连续递减
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
//初始都为1
l[i]=1;
r[i]=1;
}
//递推求两种数列
for(int i=2;i<=n;i++){
if(a[i]>a[i-1]){
l[i]=l[i-1]+1;
}
}
for(int i=n-1;i>=1;i--){
if(a[i]<a[i+1]){
r[i]=r[i+1]+1;
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,l[i]);//可能不需要修改就是最长的了
if(a[i+1]-a[i-1]>=2){
//可修改的情况,需要判断前后是否能连在一起
ans=max(ans,l[i-1]+r[i+1]+1);
}
}
cout<<ans<<endl;
/*for(int i=1;i<=n;i++) cout<<l[i]<<" ";
cout<<endl;
for(int i=1;i<=n;i++) cout<<r[i]<<" ";*/
return 0;
}
/*
6
7 2 3 1 5 6
*/
总结
主要还是思维模式,只要想到了方法问题就很好解决了