DZY has a sequence a, consisting of n integers.
We'll call a sequence ai, ai + 1, ..., aj (1 ≤ i ≤ j ≤ n) a subsegment of the sequence a. The value (j - i + 1) denotes the length of the subsegment.
Your task is to find the longest subsegment of a, such that it is possible to change at most one number (change one number to any integer you want) from the subsegment to make the subsegment strictly increasing.
You only need to output the length of the subsegment you find.
The first line contains integer n (1 ≤ n ≤ 105). The next line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109).
In a single line print the answer to the problem — the maximum length of the required subsegment.
6 7 2 3 1 5 6
5
You can choose subsegment a2, a3, a4, a5, a6 and change its 3rd element (that is a4) to 4.
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[100010];
int dp_left[100010],dp_right[100010];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp_left,0,sizeof(dp_left));
memset(dp_right,0,sizeof(dp_right));
scanf("%d",&a[1]);
if(n == 1)
{
printf("1\n");
continue;
}
else
{
dp_left[1] = 1;
for(int i = 2;i <= n;i++)
{
scanf("%d",&a[i]);
if(a[i] > a[i-1]) dp_left[i] = dp_left[i-1]+1;
else dp_left[i] = 1;
}
dp_right[n] = 1;
for(int i = n-1;i >= 1;i--)
{
if(a[i] < a[i+1]) dp_right[i] = dp_right[i+1]+1;
else dp_right[i] = 1;
}
int m = -99999;
a[0] = 0;a[n+1] = 1000000010;
for(int i = 1;i <= n;i++)
{
int t = dp_left[i-1]+dp_right[i+1]+1;
if(a[i+1]-a[i-1]<=1) t = max(dp_left[i],dp_right[i])+1;
m = max(m,t);
}
printf("%d\n",m);
}
}
return 0;
}
解决一个关于序列操作的问题,找出最长的子序列,允许通过修改一个元素使其变为任意整数,从而形成递增序列。输入包含序列长度和序列值,输出修改后的最长子序列长度。

277

被折叠的 条评论
为什么被折叠?



