LeetCode 3176.求出最长好子序列 I:动态规划(DP)

打印 上一主题 下一主题

主题 1044|帖子 1044|积分 3132

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【LetMeFly】3176.求出最长好子序列 I:动态规划(DP)

力扣题目链接:https://leetcode.cn/problems/find-the-maximum-length-of-a-good-subsequence-i/
给你一个整数数组 nums 和一个 非负 整数 k 。假如一个整数序列 seq 满足在范围下标范围 [0, seq.length - 2] 中存在 不超过 k 个下标 i 满足 seq != seq[i + 1] ,那么我们称这个整数序列为  序列。
请你返回 nums 中  子序列 的最长长度
 
示例 1:
   输入:nums = [1,2,1,1,3], k = 2
  输出:4
解释:
最长好子序列为 [1,2,1,1,3] 。
示例 2:
   输入:nums = [1,2,3,4,5,1], k = 0
  输出:2
解释:
最长好子序列为 [1,2,3,4,5,1] 。
 
提示:


  • 1 <= nums.length <= 500
  • 1 <= nums <= 109
  • 0 <= k <= min(nums.length, 25)
解题方法:动态规划

使用一个动态规划数组                                   d                         p                              dp                  dp,此中                                   d                         p                         [                         i                         ]                         [                         l                         ]                              dp[l]                  dp[l]代表数组前                                   i                              i                  i个元素的不超过                                   l                              l                  l个相邻不同的好子序列的最大长度。
初始值                                   d                         p                         [                         i                         ]                         [                         0                         ]                         =                         1                              dp[0]=1                  dp[0]=1,其余值默认为                                   −                         1                              -1                  −1就行,转移方程:
                                         d                            p                            [                            i                            ]                            [                            l                            ]                            =                            min                            ⁡                                       {                                                                                                     d                                              p                                              [                                              i                                              ]                                              [                                              l                                              ]                                                                                                                                                                                                                  d                                              p                                              [                                              j                                              ]                                              [                                              l                                              ]                                              +                                              1                                                                                                                             if                                               n                                              u                                              m                                              s                                              [                                              i                                              ]                                              =                                              n                                              u                                              m                                              s                                              [                                              j                                              ]                                                                                                                                                  d                                              p                                              [                                              j                                              ]                                              [                                              l                                              −                                              1                                              ]                                              +                                              1                                                                                                                             if                                               n                                              u                                              m                                              s                                              [                                              i                                              ]                                              ≠                                              n                                              u                                              m                                              s                                              [                                              j                                              ]                                               and                                               l                                              >                                              0                                                                                                             dp[l] = \min \begin{cases} dp[l] & \\ dp[j][l] + 1 & \text{ if } nums=nums[j]\\ dp[j][l - 1] + 1 & \text{ if } nums \neq nums[j] \text{ and } l \gt 0 \end{cases}                     dp[l]=min⎩               ⎨               ⎧​dp[l]dp[j][l]+1dp[j][l−1]+1​ if nums=nums[j] if nums=nums[j] and l>0​
三层循环,第一层用                                   i                              i                  i从                                   0                              0                  0到                                   l                         e                         n                         (                         n                         u                         m                         s                         )                         −                         1                              len(nums)-1                  len(nums)−1,第二层用                                   l                              l                  l从                                   0                              0                  0到                                   k                              k                  k,第三层用                                   j                              j                  j从                                   0                              0                  0到                                   i                         −                         1                              i-1                  i−1。


  • 时间复杂度                                        O                            (                            l                            e                            n                            (                            n                            u                            m                            s                                       )                               2                                      ×                            k                            )                                  O(len(nums)^2\times k)                     O(len(nums)2×k)
  • 空间复杂度                                        O                            (                            l                            e                            n                            (                            n                            u                            m                            s                            )                            ×                            k                            )                                  O(len(nums)\times k)                     O(len(nums)×k)
更低复杂度请见下一题:求出最长好子序列 II
AC代码

C++

  1. class Solution {
  2. public:
  3.     int maximumLength(vector<int>& nums, int k) {
  4.         vector<vector<int>> dp(nums.size(), vector<int>(k + 1, -1));
  5.         for (int i = 0; i < nums.size(); i++) {
  6.             dp[i][0] = 1;
  7.             for (int l = 0; l <= k; l++) {
  8.                 for (int j = 0; j < i; j++) {
  9.                     int diff = nums[i] != nums[j];
  10.                     if (l - diff >= 0) {
  11.                         dp[i][l] = max(dp[i][l], dp[j][l - diff] + 1);
  12.                     }
  13.                 }
  14.             }
  15.         }
  16.         int ans = 0;
  17.         for (int i = 0; i < nums.size(); i++) {
  18.             for (int l = 0; l <= k; l++) {
  19.                 ans = max(ans, dp[i][l]);
  20.             }
  21.         }
  22.         return ans;
  23.     }
  24. };
复制代码
Python

  1. from typing import List
  2. class Solution:
  3.     def maximumLength(self, nums: List[int], k: int) -> int:
  4.         dp = [[-1] * (k + 1) for _ in range(len(nums))]
  5.         for i in range(len(nums)):
  6.             dp[i][0] = 1
  7.             for l in range(k + 1):
  8.                 for j in range(i):
  9.                     diff = int(nums[i] != nums[j])
  10.                     if l - diff >= 0:
  11.                         dp[i][l] = max(dp[i][l], dp[j][l - diff] + 1)
  12.         return max(max(dp[i]) for i in range(len(nums)))
复制代码
  同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
  Tisfy:https://letmefly.blog.csdn.net/article/details/141992543

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

反转基因福娃

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表