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