这个题是动态规划,重点在于使用两个dp数组,一个记录以当前数组结尾的最长子序列的长度。另一个记录,有多少种到这么长的方式(个数)。
重点是,初始化的边界条件 和 细节的优化。
673. 最长递增子序列的个数
给定一个未排序的整数数组,找到最长递增子序列的个数。
示例 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。
直接看代码,就懂了,两个dp。
code:
class Solution(object):
def findNumberOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
n = len(nums)
if not n: return 0
dp = [1 for _ in range(n)] # 子序列长度
dplen = [1 for _ in range(n)] # 子序列个数
for i in range(n):
for j in range(i):
if nums[j] < nums[i]:
if dp[j]+1 > dp[i]:
dp[i] = dp[j]+1
dplen[i] = dplen[j]
elif dp[j]+1 == dp[i]:
dplen[i] += dplen[j]
print(dp)
print(dplen)
maxl = max(dp)
c = 0
for i, n in enumerate(dp):
if n==maxl:
c += dplen[i]
return c
好了。