3176. 求出最长好子序列 I

Powered by:NEFU AB-IN

Link

3176. 求出最长好子序列 I

题意

给你一个整数数组 nums 和一个 非负 整数 k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标 i 满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为 好 序列。

请你返回 nums 中 好
子序列的最长长度。

思路

  1. 设定三个状态,目前是哪个元素,前一个元素是什么,用了几次不相等的名额。然后就可以记忆化搜索了,但是空间占用很大
  2. 设定两个状态,状态 dfs(i, h) 代表在数组 nums 中,当前到达第 i 个元素时,最多还能进行 h 次修改(即允许不同元素),可以得到的最长子序列长度。然后最后要求的是所有以i为结尾的最大值,状态量少很多

代码

class Math:
    max = staticmethod(lambda a, b: a if a > b else b)
    min = staticmethod(lambda a, b: a if a < b else b)


class Std:
    pass

# ————————————————————— Division line ——————————————————————


class Solution:
    def maximumLength(self, nums: List[int], k: int) -> int:

        @lru_cache(None)
        def dfs(i: int, last: int, cnt: int):
            if i == len(nums):
                return 0

            ans = 0
            if nums[i] == last:
                ans = Math.max(ans, dfs(i + 1, nums[i], cnt) + 1)
            else:
                if cnt < k:
                    ans = Math.max(ans, dfs(i + 1, nums[i], cnt + 1) + 1)
                ans = Math.max(ans, dfs(i + 1, last, cnt))

            return ans

        ans = dfs(0, -1, -1)
        dfs.cache_clear()
        return ans
class Math:
    max = staticmethod(lambda a, b: a if a > b else b)
    min = staticmethod(lambda a, b: a if a < b else b)


class Solution:
    def maximumLength(self, nums: List[int], k: int) -> int:
        
        @lru_cache(None)
        def dfs(i: int, h: int) -> int:
            if i == 0:
                return 1
            max_len = 1
            for j in range(i):
                if nums[i] == nums[j]:
                    max_len = Math.max(max_len, dfs(j, h) + 1)
                elif h > 0:
                    max_len = Math.max(max_len, dfs(j, h - 1) + 1)
            return max_len
        
        ans = 0
        n = len(nums)
        for i in range(n):
            ans = Math.max(ans, dfs(i, k))
        
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NEFU AB-IN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值