目录
一、题目
- 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。
- 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,
[3,6,2,7]
是数组[0,3,1,6,2,2,7]
的子序列
二、 分析
(一)dp数组的含义
dp[i]
表示以nums[i]
这个数结尾的最长递增子序列的长度- 例如:
(二)演示
(三)核心代码
int LCS(vector<int> &nums, vector<int> &dp)
{
for (int i = 0; i < nums.size(); i++)//初始化dp数组
{
dp[i] = 1;
}
if (nums.size() <= 1)
return nums.size();
for (int i = 1; i < nums.size(); i++)
{
for (int j = 0; j < i; j++)
{
if (nums[i] > nums[j])
{
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int k = 0;//用k保存最长递增子序列的长度
for (int i = 0; i < nums.size(); i++)
{
k = k > dp[i] ? k : dp[i];
}
return k;
}
(四)完整代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int LCS(vector<int> &nums, vector<int> &dp)
{
for (int i = 0; i < nums.size(); i++)//初始化dp数组
{
dp[i] = 1;
}
if (nums.size() <= 1)
return nums.size();
for (int i = 1; i < nums.size(); i++)
{
for (int j = 0; j < i; j++)
{
if (nums[i] > nums[j])
{
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
int k = 0;//用k保存最长递增子序列的长度
for (int i = 0; i < nums.size(); i++)
{
k = k > dp[i] ? k : dp[i];
}
return k;
}
int main()
{
int n;
cout << "请输入数据个数:" << endl;
cin >> n;
vector<int>nums(n);//保存数据
vector<int> dp(n);// dp[i] 表示以 nums[i] 这个数结尾的最长递增子序列的长度
vector<vector<int>>t;
cout << "请依次输入元素个数:" << endl;
for (int i = 0; i < n; i++)
{
cin >> nums[i];
}
cout<<"最长公共子序列的长度是:"<<LCS(nums, dp);
return 0;
}