力扣673.最长递增子序列的个数
刚看到这个题目的时候,第一时间向想到的最长子序列的长度,之前做过找最长子序列长度的问题,这个题目是让我们找出最长子序列的个数,再参考https://leetcode-cn.com/problems/number-of-longest-increasing-subsequence/solution/673-zui-chang-di-zeng-zi-xu-lie-de-ge-sh-g7a0/关于动态规划的解答后,第一时间也没有太明白,主要是困惑集中在状态转移部分。1.为什么dp[j]+1>dp[i]以及后面的操作。2.为什么dp[j]+1=dp[i]之后后续的操作变为单纯的count操作。在我举了一个例子之后,发现是自己理解的问题,未考虑到初始的的两个定义,dp和count。首先我们初始时,定义dp和count全部为和数组长度相同的列表。然后,我们需要根据数组列表的大小关系去更新dp和count两个列表。当遍历完整个数组之后,dp和count两个列表也都更新完毕。最后,再根据更新完成后的dp和count列表进行下面的操作。

n=len(nums) if n==1: return 1 dp=[1]*n count=[1]*n max_length=0 for i in range(1,n): for j in range(i): if nums[i]>nums[j]: if dp[j]+1>dp[i]: dp[i]=dp[j]+1 count[i]=count[j] elif dp[j]+1==dp[i]: count[i]+=count[j] max_length=max(max_length,dp[i]) res=0 for i in range(n): if dp[i]==max_length: res+=count[i] return res

浙公网安备 33010602011771号