動機
dp的比較好理解
Problem
Given an integer array nums
, return the number of longest increasing subsequences.
Notice that the sequence has to be strictly increasing.
Example 1:
Input: nums = [1,3,5,4,7]Output: 2Explanation: The two longest increasing subsequences are [1, 3, 4, 7] and [1, 3, 5, 7].
Example 2:
Input: nums = [2,2,2,2,2]Output: 5Explanation: The length of longest continuous increasing subsequence is 1, and there are 5 subsequences' length is 1, so output 5.
Constraints:
1 <= nums.length <= 2000
-106 <= nums[i] <= 106
Sol
在dp時留一個紀錄總數的位置
class Solution:
def findNumberOfLIS(self, nums: List[int]) -> int:
@cache
def dp(i):
if i == 0:
return [1,1] # len, cnt
else:
ls = [dp(x) for x in range(i) if nums[x] < nums[i]]
l = max(ls,key=itemgetter(0),default=[0])[0]
cnt = max(1,sum([x[1] for x in ls if x[0] == l], 0))
return [l+1, cnt]
dps = [dp(i) for i in range(len(nums))]
maxlen = max(dps,key=itemgetter(0))[0]
#print(dps)
return sum([x[1] for x in dps if x[0] == maxlen])
Case Study
另外有一個patience sort的作法,這裡,之後有時間來研究