最长递增子序列个数

来源:互联网 发布:windows账户格式 编辑:程序博客网 时间:2024/06/06 02:02

example 1
数组[1,3,5,4,7] 最长递增子序列有[1,3,5,7]与[1,3,4,7]两个长度为4的数组

example 2
数组[2,2,2,2,3]最长递增子序列为[2,3],有4个

使用dp算法,给定数组[nums],最长递增子序列长度:
L(i) = max(L(j) + 1) if nums[j] < nums[i] for 1<=j < i

def findNumberOfLIS(nums):    n = len(nums)    dp = [[1,1] for i in range(n)]      #dp[i][0] 存储以下标i结尾的数组的最长递增子序列长度     #dp[i][i] 存储以下表i结尾的最长递增子序列的个数    max_for_all = 1#初始化最大个数    for i, value in enumerate(nums):        cur_max, count = 1, 0         #cur_max 存储当前递增序列长度count纪录最长长度的个数        for j in range(i):#遍历子问题            if nums[j] < value:                if dp[j][0]+1 > cur_max:                    cur_max = dp[j][0]+1#更新当前最大长度                    count = 0 #如果需要更新那么说明这个最大长度是第一次出现                if dp[j][0]+1 == cur_max:                    #如果最大长度又出现了,加上之前已有的次数dp[j][1]                    count+=dp[j][1]        dp[i] = [cur_max, max(count, dp[i][1])]#更新dp        max_for_all = max(cur_max, max_for_all)    return sum([item[1] for item in dp if item[0]==max_for_all])#计算最长长度出现的总次数nums=[1,3,5,4,7]print(findNumberOfLIS(nums))#OUTPUT:2
原创粉丝点击