(M)Dynamic Programming:300. Longest Increasing Subsequence

来源:互联网 发布:nodetype js 编辑:程序博客网 时间:2024/06/05 16:41

建一个一维dp,长度为n,dp[i]表示包含nums[i]这个数字的最长的递增子序列长度。这个长度怎么找,就是要遍历nums[i]之前的这些数字,如果nums[j]<nums[i],说明nums[i]可以和他构成递增子序列,和他构成递增子序列可以有dp[j]+1这么长,遍历nums[i]之前所有比nums[i]小的数字,取最长的那个,就是nums[i]包含这个数字的最长递增子序列长度。

class Solution {public:    int lengthOfLIS(vector<int>& nums) {        int n = nums.size();        if(n == 0)            return 0;        vector<int> dp(n, 1);        int res = 1;        for(int i = 1; i < n; ++i)        {            for(int j = i - 1; j >= 0; --j)            {                if(nums[j] < nums[i])                {                    dp[i] = max(dp[i], dp[j] + 1);                }               }            res = max(res, dp[i]);        }        return res;    }};