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