题目:
给定一个未排序的整数数组,找到最长递增子序列的个数。
思路:
leetcode300.最长递增子序列的进阶版
动态规划,用一个数组来记录长度,一个数组来记录个数
解答:
class Solution:
def findNumberOfLIS(self, nums: List[int]) -> int:
#dp[i] 表示以nums[i] 结尾的最长上升子序列的长度
#cnt[i] 表示以nums[i] 结尾的最长上升子序列的个数
n, max_len, ans = len(nums), 0, 0
dp = [0] * n
cnt = [0] * n
for i, x in enumerate(nums):
dp[i],cnt[i] = 1,1
for j in range(i):
if x > nums[j]:
if dp[j] + 1 > dp[i]:
dp[i] = dp[j] + 1
# 重置计数
cnt[i] = cnt[j]
elif dp[j] + 1 == dp[i]:
cnt[i] += cnt[j]
if dp[i] > max_len:
max_len = dp[i]
# 重置计数
ans = cnt[i]
elif dp[i] == max_len:
ans += cnt[i]
#print(dp,cnt)
return ans