/*
题意,给定序列,问如果给你一次机会修改一个数,则该序列的最长上升子串是什么
对于ai,我们可以预处理出ai-1往左的最长下降序列,以及ai+1向右的最长上升序列
直接维护答案即可.
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 100;
int a[maxn];
int dp[maxn][2];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
dp[i][0]=1;
dp[i][1]=1;
}
int ans=2;
for(int i=2;i<=n;++i)
{
if(a[i]>a[i-1]) dp[i][0]=dp[i-1][0]+1;
else dp[i][0]=1;
ans=max(ans,dp[i][0]+1);
}
for(int i=n-1;i>=1;i--)
{
if(a[i]<a[i+1]) dp[i][1]=dp[i+1][1]+1;
else dp[i][1]=1;
ans=max(ans,dp[i][1]+1);
}
for(int i=2;i<n;++i)
{
if(a[i-1]+1<a[i+1])
ans=max(ans,dp[i-1][0]+dp[i+1][1]+1);
}
ans=min(ans,n);
printf("%d\n",ans);
return 0;
}
447 C. DZY Loves Sequences
最新推荐文章于 2020-11-21 16:23:02 发布