系列文章目录
【动态规划】最长子串问题汇总(二)最长连续上升子序列
【动态规划】最长子串问题汇总(六)归纳对比
目录
前言
在练习算法的过程中,发现各种子序列问题容易混淆,问题通常是连续,公共,上升(递增)三词随意组合,本系列就最长子串(子序列)问题进行归纳对比
一、题目描述
给定一个未排序的数组,求其最长连续上升子序列长度
二、输入输出样例
输入是一个一维数组(字符串同理),输出是一个正整数,表示最长连续上升子序列的长度
输入:[10,9,2,3,7,101,18]
输出:4
此样例中,最长上升子序列为[2,3,7,18]或[2,3,7,101],但是最长连续上升子序列为[2,3,7,101]
三、算法分析
定义一个一维 dp 数组,dp[i] 表示 以 i 结尾 的、最长连续上升子序列长度
if(nums[ i ] > nums[ i - 1 ]) 则说明连续上升
int getLength(vector<int> nums){
int max_len=0; //存最长的长度
int n=nums.size();
if(n<=1) return n;
vector<int> dp(n,1); //初始化为1
/*------------------区别部分------------------*/
for(int i=1;i<n;i++){ //对于每个位置遍历
if(nums[i]>nums[i-1]){ //连续
dp[i]=dp[i-1]+1;
}
else{
dp[i]=1; //不连续
}
max_len=max(max_len,dp[i]);
}
/*------------------区别部分------------------*/
return max_len;
}
/*------------------区别部分------------------*/
其中的代码是各种最长子串(子序列)问题的具体区别
/*------------------区别部分------------------*/