【问题描述】
给出一个由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
算法思想:
- 创建一个长度为n的dp数组,用于记录以每个元素结尾的最大递增子数组的长度。
- 初始化dp数组,每个元素都至少是一个递增子数组。
- 遍历数组a,对于每个元素a[i],比较它与前一个元素a[j]的大小关系,如果a[i]大于a[j],则在以a[j]结尾的递增子数组的基础上加上a[i],更新dp[i]为dp[j]+1。
- 遍历dp数组,找到最大的元素,即为最大递增子数组的长度。
- 输出最大递增子数组的长度。
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;
}