算法与数据结构实验题 2.20 最长递增子段

★实验任务

YZF 有一个序列 A,由 n 个整数组成。

我们将子段 A 称为 Ai、Ai +1、Ai+ 2、…Aj(1<=i<=j=n)表示 A 的子段。

你的任务是找到 A 的最长的子段,这样就可以从子段最多改变一个数(可改变为任一个整数),使子段严格地增加。

输出找到的最长子段的长度即可。

★数据输入

输入第一行为一个正整数 n

第二行为 n 个数,第 i 个代表 ai。,0<=ai<=1000000000

对于 30%的数据,1<=n<=666;

对于 100%的数据,1<=n<=100086;

★数据输出

输出找到的最长子段的长度即可。

输入示例
6
7 2 3 1 5 6
输出示例
5
#include<bits/stdc++.h>
using namespace std;

int found_length(int a[],int start,int end)
{
	int count = 1;
	for(int i = start;i<end;i++)
	{
		if(a[i]<a[i+1]) count++;
	}
	return count;
}//找出当前位置为起点往后的递增序列长度 

int main(){
	
	int now,cur,pre;
	
	int n;
	cin>>n;
	int arr[n];
	for(int i = 0;i<n;i++)
	{
		cin>>arr[i];
	}
	cur = found_length(arr,0,n);//当前位置递增序列的长度 
	now = cur;//目前已知最长的序列的长度 
	pre = cur;//上一个递增序列的长度 
	
	int index = 0;
	while(index<n)
	{
		index+=pre;
		if(index==n)
		break;
		cur = found_length(arr,index,n);
		
		if(cur>=now)//大于等于时直接加一,因为可以修改一个数字 
			now = cur+1;
		if(arr[index-1]>=arr[index]&&arr[index+1]>arr[index]+1)//特殊情况凹型判断是否进行拼接 
		{
			//凹型
			now = now<pre+cur?pre+cur:now; 
		}
		pre = cur; 
		
	}
	
	cout<<now;
	
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值