[动态规划] leetcode 673 Number of Longest Increasing Subsequence

problem:https://leetcode.com/problems/number-of-longest-increasing-subsequence/

       这道题问的是最长的连续子序列的个数。这道题是XX子序列系列,是求最长连续子序列长度的升级版,关于求最长子序列长度,我们可以设定一个数组length,lenght[ i ] 代表以i为结尾的最长连续子序列长度,那么可以通过如下方式得到结果:

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        vector<int> length(nums.size(), 1);
        int maxLen = 1;
        for (int i = 0; i < nums.size(); i++)
        {
            for (int j = 0; j < i; j++)
            {
                if (nums[i] > nums[j])
                {
                    if (length[j] + 1 > length[i])
                    {
                        length[i] = length[j] + 1;
                        maxLen = max(maxLen, length[i]);
                    }
                }
            }
        }
        return maxLen;
    }
};

         如果要记录个数,我的想法是在更新长度的同时更新个数。维护一个数组count,count[ i ] 代表以i为结尾的最长连续子序列的个数。之后遍历一遍count数组,把等于最大长度的count累加起来得到结果:

class Solution {
public:
    int findNumberOfLIS(vector<int>& nums) {
        vector<int> length(nums.size(), 1);
        vector<int> count(nums.size(), 1);
        int maxLen = 1;
        for (int i = 0; i < nums.size(); i++)
        {
            for (int j = 0; j < i; j++)
            {
                if (nums[i] > nums[j])
                {
                    if (length[j] + 1 > length[i])
                    {
                        length[i] = length[j] + 1;
                        count[i] = count[j];
                        maxLen = max(maxLen, length[i]);
                    }
                    else if (length[j] + 1 == length[i])
                    {
                        count[i] += count[j];
                    }
                }
            }
        }

        int res = 0;
        for (int i = 0; i < nums.size(); i++)
        {
            if (length[i] == maxLen) res += count[i];
        }
        return res;
    }
};

 

posted @ 2019-08-07 14:10  fish1996  阅读(146)  评论(0)    收藏  举报