力扣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

 

posted @ 2021-09-20 14:09  hongnal  阅读(63)  评论(0)    收藏  举报