1.题目解析
题目来源:300.最长递增子序列——力扣
测试用例
2.算法原理
1.状态表示
首先创建一个与数组大小相同的dp表,此时dp[i]表示的是:以第i个位置为结尾的所有子序列中最长递增子序列的长度
2.状态转移方程
此时第i个位置一定是最长递增子序列的最大值,因此需要向前判断即nums[j] < nums[i],当找到小于的值就可以放入递增子序列,此时求dp[j]+1与dp[i]的最大值即可
3.初始化
由于递增子序列的最小值一定是1,也就是1个数也可以构成递增子序列,那么就可以将dp表的所有元素均初始化为1,这样就不用单独判断单个数字的递增子序列长度
4.填表顺序
从左到右,每个位置单独判断
5.返回值
返回整个dp表的最大值,因为最长递增子序列可能出现在任何一个位置
3.实战代码
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();vector<int> dp(n,1);int ret = 1;for(int i = 1;i < n;i++){for(int j = 0;j < i;j++){if(nums[j] < nums[i]){dp[i] = max(dp[j] + 1,dp[i]);}}ret = max(ret,dp[i]);}return ret;}
};