其他分享
首页 > 其他分享> > leetcode-673. 最长递增子序列的个数

leetcode-673. 最长递增子序列的个数

作者:互联网

 

 

/*
    dp[i]表示以i下标结尾的最长严格递增子序列的长度,需要注意的是最后算出来的dp[i]才是以i下标结尾的
    最长严格递增子序列的长度,中间运行过程中dp[i]并不是以i结尾的最长严格递增子序列的长度,
    而是以i结尾的递增子序列的长度。
        
    cnt[i]为考虑以nums[i]结尾的最长上升子序列的个数

    那么在nums[i] > nums[j]前提下,
    有两种情况:
    (1)如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 > dp[i],说明找到了一个更长的递增子序列。
    那么以j为结尾的子串的最长递增子序列的个数,就是最新的以i为结尾的子串的最长递增子序列的个数,
    即:count[i] = count[j]。
    (2)如果在[0, i-1]的范围内,找到了j,使得dp[j] + 1 == dp[i],说明找到了两个相同长度的递增子序列。
    那么以i为结尾的子串的最长递增子序列的个数 就应该加上以j为结尾的子串的最长递增子序列的个数,
    即:count[i] += count[j];


*/
class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        int n = nums.size();
        if(n<=1)
            return n;
        vector<int> dp(n,1);
        vector<int> cnt(n,1);  
        int maxval = -1;

        for(int i = 0; i < n; i++){
            for(int j = 0; j < i; j++){
                if(nums[i] > nums[j]){                                      
                    if(dp[i] < dp[j]+1)
                        cnt[i] = cnt[j];
                    else if(dp[i] == dp[j]+1)
                        cnt[i] = cnt[i] + cnt[j];
                    dp[i] = max(dp[i], dp[j]+1);
                }
                maxval = max(maxval,dp[i]);
            }
        }
         
        int res = 0;;
        for(int i = 0; i<n; i++){
            // 如果以i结尾的递增子序列长度等于最大值,将以i即为的递增子序列个数进行累加
            if(dp[i]==maxval)  
                res += cnt[i];
        }
        cout<<"res:"<<res<<endl;
        return res;
    }
};

 

标签:cnt,nums,int,递增,个数,673,序列,leetcode,dp
来源: https://www.cnblogs.com/ymec/p/15314311.html