题目链接:https://leetcode.cn/problems/longest-increasing-subsequence/
一.先介绍一下什么是子序列
子序列和子数组的概念很像,但是又有一些区别,子数组是在题目要求的数组中找出一段按照顺序的、连续的子数组区间;而子序列是在题目给出的序列中(可能是数组可能是字符串)找出一段按照一定顺序的、可以不连续的子序列区间。不难发现子序列最大的特征正是可以不连续,所以在分析状态方程时,我们通常分析以 i为结尾的状态时通常是要研究 j ~ i 区间内( 0 < j < i)可能出现的情况,不能像子数组的题一样只根据 i - 1位置的状态辅助分析 i位置的状态。
二.题目介绍
三.状态分析
四.完整代码
int lengthOfLIS(vector<int>& nums)
{
// 1.建表
// 2.初始化
// 3.填表
// 4.返回值
int n = nums.size(), res = 1;
vector<int> dp(n, 1);
for(int i = 1; i < n; i++)
{
for(int j = i-1; j >= 0; j--)
{
if(nums[i] > nums[j])
{
dp[i] = max(dp[i], dp[j] + 1);
}
res = max(dp[i], res);
}
}
return res;
}