【动态规划】最长子串问题汇总(一)最长上升子序列

本文档介绍了动态规划在解决最长子串问题中的应用,包括最长上升子序列、最长连续上升子序列、最长公共子序列和最长公共上升子序列等,通过算法分析和代码示例展示了它们之间的区别和计算方法。
摘要由CSDN通过智能技术生成

系列文章目录

【动态规划】最长子串问题汇总(一)最长上升子序列

【动态规划】最长子串问题汇总(二)最长连续上升子序列

【动态规划】最长子串问题汇总(三)最长公共子序列

【动态规划】最长子串问题汇总(四)最长公共上升子序列

【动态规划】最长子串问题汇总(五)最长连续公共子序列

【动态规划】最长子串问题汇总(六)归纳对比


目录

在练习算法的过程中,发现各种子序列问题容易混淆,问题通常是连续,公共,上升(递增)三词随意组合,本系列就最长子串(子序列)问题进行归纳对比


一、题目描述

给定一个未排序的数组,求其最长上升子序列


二、输入输出样例

输入是一个一维数组(字符串同理),输出是一个正整数,表示最长上升子序列的长度

输入:[10,9,2,3,7,101,18]

输出:4

此样例中,最长上升子序列为[2,3,7,18]或[2,3,7,101]


三、算法分析

定义一个一维 dp 数组dp[i] 表示 以 i 结尾 的、最长上升子序列长度

dp[i]=max\left\{\begin{matrix} dp[i]\\ dp[j]+1 \end{matrix}\right.

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²)

/*------------------区别部分------------------*/

其中的代码是各种最长子串(子序列)问题的具体区别

/*------------------区别部分------------------*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值