【题目描述】
给你一个整数数组nums
,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是[0,3,1,6,2,2,7]
的子序列
【示例】
输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。
输入:nums = [7,7,7,7,7,7,7]
输出:1
来源:力扣
【动态规划步骤分析】
- (1)确定状态
f[i]
:i
之前(包括i
)的最长严格递增子序列的长度为f[i]
;
- (2)转移方程
- 位置
i
的最长递增子序列等于j
从0
到i-1
个位置的最长上升子序列+1
的最大值。
if(nums[i] > nums[j]) f[i] = max(f[i],f[j]+1); //不是把f[i]与f[j]+1比较,而是取f[j]+1的最大值
- 位置
- (3)初始化
- 每个
i
,对应的f[i]
(最长上升子序列的长度)起始值至少都是1
.
- 每个
- (4)计算顺序
f[i]
是由0
到i-1
各个位置的最长上升子序列推导而来,那么i
遍历顺序为从前到后j
就是从0
到i-1
,遍历i
的循环在外面,遍历j
在内层;
【C++实现】
int lengthOfList(vector<int>& nums){
if(nums.size() <= 1) return nums.size();
vector<int> f(nums.size(),1);
int result = 0;
for(int i = 1;i < nums.size();++i){
for(int j = 0;j < i;++j){
if(nums[i] > nums[j])
f[i] = max(f[i],f[j]+1);
}
if(f[i] > result) //取最长子序列
result = f[i];
}
return result;
}
【参考】代码随想录