牛客 牛牛的数列

传送门

题目描述

牛牛现在有一个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
*/ 

总结

主要还是思维模式,只要想到了方法问题就很好解决了

猜你喜欢

转载自blog.csdn.net/Lzhzl211/article/details/114785823
今日推荐