湖大CG满分教程:作业训练四编程题18. 最长连续递增子序列

该文描述了一个算法问题,即给定一个正整数数组,找出数组中的最大递增子数组长度。通过动态规划方法,初始化一个dp数组并遍历原数组,更新dp数组以找到最长递增子数组的长度。最后输出最大长度。
摘要由CSDN通过智能技术生成

【问题描述】

给出一个由n个正整数组成的数组。您的任务是找到给定数组的递增子数组的最大长度。

递增子数组由数组中若干个连续元素组成,且子数组中的每个元素严格地大于前一个元素。

【输入形式】

第一行为一个正整数n(1≤n≤105),表示数组元素的个数

第二行给出n个正整数a1 a2......an  (1≤ai≤109) ,整数之间使用空格分隔
【输出形式】

输出最大递增子数组的长度
【样例输入】

5
1 7 2 11 15

【样例输出】

3

【样例说明】

1 7可以构成一个递增子数组

2 11 15可以构成一个递增子数组

所以本样例的输出结果为3

算法思想:

  1. 创建一个长度为n的dp数组,用于记录以每个元素结尾的最大递增子数组的长度。
  2. 初始化dp数组,每个元素都至少是一个递增子数组。
  3. 遍历数组a,对于每个元素a[i],比较它与前一个元素a[j]的大小关系,如果a[i]大于a[j],则在以a[j]结尾的递增子数组的基础上加上a[i],更新dp[i]为dp[j]+1。
  4. 遍历dp数组,找到最大的元素,即为最大递增子数组的长度。
  5. 输出最大递增子数组的长度。

dp方程可以定义如下:

假设dp[i]表示以第i个元素结尾的最大递增子数组的长度,则有以下递推关系:

dp[i] = max(dp[j] + 1, 1),其中 0 ≤ j < i 且 a[j] < a[i]

解释:对于每个元素a[i],我们需要找到它之前所有比它小的元素a[j],并且以a[j]结尾的递增子数组的长度加上a[i]本身可以构成以a[i]结尾的更长的递增子数组。因此,我们需要遍历0到i-1的所有j,找到满足条件的最大dp[j],然后加上1(表示加上当前元素a[i])。

最终的结果是dp数组中的最大值,即maxLen = max(dp[0], dp[1], ..., dp[n-1])。

#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int a[n];
	for(int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	
	int dp[n];
	for(int i = 0; i < n; i++)
	{
		dp[i] = 1;  // 初始化dp数组,每个元素都至少是一个递增子数组
	}
	
	for(int i = 0; i < n; i++)
	{
	    int j = i - 1;
		if(a[i] > a[j])
		{
			dp[i] = max(dp[j] + 1, dp[i]);  // 如果a[i]大于前一个元素a[j],则在以a[j]结尾的递增子数组的基础上加上a[i],更新dp[i]
		}
	}
	
	int maxLen = 0;
	for(int i = 0; i < n; i++)
	{
		if(dp[i] > maxLen)
			maxLen = dp[i];  // 更新最大递增子数组的长度
	}
	
	cout << maxLen;
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值