zoukankan      html  css  js  c++  java
  • 最长上升子序列的长度&最长上升子序列的个数(动态规划)

    动态规划思想

    注意:子串和子序列的区别

    子串一定时连续的,子序列不一定是连续的

    首先清楚dp数组的含义

    定义:dp[i]表示以nums[i]这个数结尾的最长递增子序列的长度

    因为nums[3]=4,最长递增子序列为1,3,4,所以长度为3即dp[3]=3

    既然是递增子序列,只要找到前面那些结尾比4小的子序列,然后把4接到最后,就可以形成一个新的递增子序列,长度加1

    class Solution:
        def lengthOfLIS(self, nums: List[int]) -> int:
            # 初始化dp数组为1
            dp = [1] * len(nums)
            for i in range(len(nums)):
                for j in range(i):
                    if nums[i] > nums[j]:
                        dp[i] = max(dp[i], dp[j]+1)
            
            res = 0
            for i in range(len(dp)):
                res = max(res, dp[i])
            return res
    

      

    class Solution:
        def findNumberOfLIS(self, nums: List[int]) -> int:
            if not nums:
               return 0
            # length表示以x为结尾的最长递增子序列的长度
            length = [1 for _ in range(len(nums))] 
            # count 表示以x为结尾的最长递增子序列的个数
            count = [1 for _ in range(len(nums))]
            for i in range(len(nums)):
                for j in range(i):
                    if nums[i] > nums[j]:
                        # 在初始化的length表基础上,正常都是length前面的值小于等于length后面的值(初始化为1)
                        if length[j] >= length[i]:
                            length[i] = length[j] + 1
                            count[i] = count[j]
                    # 如果遇到这个i前面两个相同的值,第二次进入这个条件时,这个i已经是做过length[i] = length[j] + 1,即有两个长度相同的子序列
                        elif length[j] + 1 == length[i]:
                            count[i] += count[j]
    
            res = 0
            # 找最长递增子序列,要在length中找长度最长的子序列个数之和
            maxSub = max(length)
            for i in range(len(nums)):
                if length[i] == maxSub:
                    res += count[i]
            return res
    

      

  • 相关阅读:
    EMIF接口的寻址问题
    C6000系类的内联函数
    C6000代码层面优化(一)
    RHCE学习笔记
    找出并关闭Ruby On Rails进程.
    Rails4添加bootstrap支持
    如何删除gnome3面板上的图标?
    出现 ruby cannot load such file -- zlib 问题的解决方法
    Debian安装软件时提示插入光盘
    Debian7桌面屏蔽图标和右键菜单的解决方法。
  • 原文地址:https://www.cnblogs.com/GumpYan/p/13154999.html
Copyright © 2011-2022 走看看