题目
leetcode 300.最长增长子序列
Q:在整数数组nums中求最长严格递增子序列长度
思路
遍历nums中每一个元素,把每个元素作为递增子序列结尾(注意这个元素必须被选取)的情况找出来,最后输出最长序列长度
动态规划实现,以下求状态转移方程
状态
dp[i]:第i个元素作为递增子序列结尾时,子序列的长度
注意:nums[I]作为递增子序列结尾,则该子序列前的元素一定小于nums[i]
转移方程
需要满足两个条件:
1、子序列递增 2、新子序列结尾元素为nums[i]
已知:dp[j] (0 <= j < i) nums[i]前的所有原递增子序列的长度
求解:dp[i] 以nums[i]结尾的新子序列
解决办法:在nums[i]前找nums[j]小于nums[i]的最长子序列,再加上新的结尾元素nums[i],组成新的递增以nums[i]结尾的新序列
可得:在nums[j] < nums[i] && j < i的情况下:dp[i] = max(dp[j]) + 1
状态转移方程初始化
只有一个元素的子序列长度为1
dp[i] = 1
最长子序列长度
lengthMax = max(dp[I])
AC代码
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 1);//只有一个元素的子序列长度为1
int Max;
for(int i = 0; i < n; i++) {
for(int j = i - 1; j >= 0; j--) {
if(nums[j] < nums[i]) {
Max = dp[j] + 1;
dp[i] = max(Max, dp[i]);
}
}
}
//求最长的子序列
Max = dp[0];
for(int i = 1; i < n; i++)
Max = max(dp[i], Max);
return Max;
}
};