【问题描述】
给出一个由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
对于小菜鸡的我动态规划太难理解,于是就去网上学了一下昨日在互帮群窥屏窥到的一个知识点链接,不得不说很详细也很简单易懂。分享给你们,(10条消息) 什么是动态规划(Dynamic Programming)?动态规划的意义是什么?_算法与数学之美-CSDN博客
用了三个做法,前两个为动规思路,第二个借鉴大佬的思路,第三个不用动规也是大佬的思路。都是ac代码。?
第一个:动规1?
//动态规划求出最长子序列1
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
int a[n],f[n];
for(int i=0;i<n;i++){
cin>>a[i];
f[i]=1;
}
for(int i=0;i<n;i++)
for(int j=0;j<i;j++){
if(a[i]>a[j]&&j+1==i)//题目中说了是前一个元素,找了半天的错误
f[i]=max(f[i],f[j]+1);//dp状态方程
}
sort(f,f+n);
cout<<f[n-1];
}
?第二个:动规2,大佬的代码链接:(11条消息) 4.19 最长连续递增子序列_下雨了嘿咻呀的博客-CSDN博客
//动态规划求出最长子序列2
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
int a[n],b[n];
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=1;
}
for(int i=0;i<n-1;i++){
if(a[i]<a[i+1])
b[i+1]=b[i]+1;//继续在前一个的基础上加一即可
}
sort(b,b+n);
cout<<b[n-1];
}
第三个:不用动规,大佬代码链接:(9条消息) 湖南大学21夏训练四19.最长连续递增子序列_makabakala的博客-CSDN博客?
//不用动规1
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int count=1,max=0;
for(int i=0;i<n-1;i++){
if(a[i]<a[i+1])
count++;
else if(a[i]>=a[i+1]){
count=1;
}
if(max<count)
max=count;
}
cout<<max;
}
|