一,问题描述
二,问题分析
1.定义状态:memo[i] :表示以第i个数字结尾的最长上升子序列的长度
2.初始状态:memo[i] :都为1,表示本身的长度
3.状态的转移:memo[i] = max(memo[i] , memo[j] +1) nums[j]<nums[i]
意思是在第 i 个数字之前如果有一个数字小于第 i 个数字,意味着满足上升序列的要求,再比较现在第i个位置的长度和第j个位置的长度+1,取较大值
三,代码解答
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
//memo[i] : 以nums[i]结尾的最长上升子序列长度
vector<int> memo(nums.size(),1);
for(int i=0;i<nums.size();i++){ //第一个循环,更新memo数组
for(int j=i-1;j>=0;j--){ //尝试是否更新memo数组
if(nums[j] < nums[i]){
memo[i] = max(memo[i], memo[j]+1);
}
}
}
int res = 0;
for(int i=0;i<nums.size();i++){ //找出memo数组的中最大值,即为最长上升子序列长度
res = max(res,memo[i]);
}
return res;
}
};