zoukankan      html  css  js  c++  java
  • 动态规划精讲(一)LC 最长递增子序列的个数

    最长递增子序列的个数

    给定一个未排序的整数数组,找到最长递增子序列的个数。

    示例 1:

    输入: [1,3,5,4,7]
    输出: 2
    解释: 有两个最长递增子序列,分别是 [1, 3, 4, 7] 和[1, 3, 5, 7]。
    示例 2:

    输入: [2,2,2,2,2]
    输出: 5
    解释: 最长递增子序列的长度是1,并且存在5个子序列的长度为1,因此输出5。

    思路:

    思路
    我们需要定义两个vector数组:

    vector<int> dp(n,1): 表示以nums[i]结尾的LIS长度
    vector<int> count(n,1): 表示以nums[i]结尾的LIS的组合的个数
    这里两个数组全部初始化为1,显然当序列长度为1时,LIS的长度为1,并且所有LIS的个数至少为1(不可能为零)

    两重循环遍历

    第一重用i扫描(1 <= i < nums.size())
    第二重用j扫描(0 <= j < i)
    显然 j 永远小于 i

    若要LIS成立,我们只要考虑nums[j] < nums[i]的情况,其他情况则不考虑

    (1)当dp[j]+1 > dp[i]时,意味着我们第一次找到这个组合
    (2)当dp[j]+1 == dp[i]时,意味着我们不是第一次找到这个组合

    当我们遇到情况(1)时(dp[j]+1 > dp[i]),只需要将LIS的长度加一,并且将组合数设为与nums[j]一样即可

    当我们遇到情况(2)时(dp[j]+1 == dp[i]),只需要将nums[j]的组合数添加上去即可

    注意以上两种情况都是基于(nums[j] < nums[i])

    最后我们返回所有LIS的所有组合数

    class Solution {
    public:
        int findNumberOfLIS(vector<int>& nums) {
            int n = nums.size();
            if(n<=0) return n;
            vector<int> dp(n, 1);
            vector<int> count(n,1);
    
            for(int i=1; i<n; i++) {
                for(int j=0; j<i; j++) {
                    if(nums[j] < nums[i]) {
                        // 第一次找到
                        if(dp[j]+1 > dp[i]) {
                            dp[i] = dp[j] + 1;
                            count[i] = count[j];
                        // 再次找到
                        } else if(dp[j]+1 == dp[i]) {
                            count[i] += count[j];
                        }
                    }
                }
            }
            // 最后的返回值应该是所有最大长度的所有count的总和
            int max = *max_element(dp.begin(), dp.end());
            int res = 0;
            for(int i=0; i<n; i++) {
                if(dp[i] == max)
                    res += count[i];
            }
    
            return res;
    
        }
    };

     

    因上求缘,果上努力~~~~ 作者:每天卷学习,转载请注明原文链接:https://www.cnblogs.com/BlairGrowing/p/13938960.html

  • 相关阅读:
    This counter can increment, decrement or skip ahead by an arbitrary amount
    LUT4/MUXF5/MUXF6 logic : Multiplexer 8:1
    synthesisable VHDL for a fixed ratio frequency divider
    Bucket Brigade FIFO SRL16E ( VHDL )
    srl16e fifo verilog
    DualPort Block RAM with Two Write Ports and Bytewide Write Enable in ReadFirst Mode
    Parametrilayze based on SRL16 shift register FIFO
    stm32 spi sdcard fatfs
    SPI bus master for System09 (2)
    SQLSERVER中的自旋锁
  • 原文地址:https://www.cnblogs.com/BlairGrowing/p/13938960.html
Copyright © 2011-2022 走看看