Leetcode 3409. Longest Subsequence With Decreasing Adjacent Difference

1. 解题思路

这一题做的很失败,虽然只是一个medium的题目,但是我没有自力搞定这道题,最后是对着大佬们的解答才理解了这道题的解法的,委实有点惭愧……

这道题的思路就是动态规划,这个倒是没啥疑问,剩下的就是如何进行这个动态规划,或者说设计怎么的数据存储内容来进行复用。

这里大佬们的做法是给出了一个矩阵dp,其中,任意元素dp[i][j]表示当前一个元素的值为 i i i,且前两个元素的差值的绝对值不小于 j j j时,其最多包含的元素个数。

然后,我们依次来从左到右考察每一个位置上的元素被取用时对矩阵中元素的影响,不妨设当前位置上的元素为x,其前一个元素为y,则显然,我们有以下两个迭代关系:

  • dp[x][abs(x-y)] = max(dp[x][abs(x-y)], 1 + dp[y][abs(x-y)])
  • dp[x][delta] = max(dp[x][delta], dp[x][delta+1])

由此,我们进行一下遍历即可得到所有的可能性,然后所有取出第一列元素的最大值,即可得到我们最终的答案。

2. 代码实现

给出python代码实现如下:

class Solution:
    def longestSubsequence(self, nums: List[int]) -> int:
        m = max(nums)
        nums = [x-1 for x in nums]
        dp = [[-m for _ in range(m)] for _ in range(m)]
        for num in nums:
            for pre in range(m):
                delta = abs(num - pre)
                dp[num][delta] = max(dp[num][delta], dp[pre][delta]+1)
            
            for delta in range(m-1, -1, -1):
                dp[num][delta] = max(dp[num][delta], 1)
                if delta < m-1:
                    dp[num][delta] = max(dp[num][delta], dp[num][delta+1])
        return max(dp[num][0] for num in range(m))

提交代码评测得到:耗时11133ms,占用内存21.8MB。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值