【每日一题Day262】LC1911最大子序列交替和 | dp

这篇具有很好参考价值的文章主要介绍了【每日一题Day262】LC1911最大子序列交替和 | dp。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最大子序列交替和【LC1911】

一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 减去 奇数 下标处元素之

  • 比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4

给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编号)。

一个数组的 子序列 是从原数组中删除一些元素后(也可能一个也不删除)剩余元素不改变顺序组成的数组。比方说,[2,7,4][4,**2**,3,**7**,2,1,**4**] 的一个子序列(加粗元素),但是 [2,4,2] 不是。

做了那么久怎么还是那么菜呢

  • 思路:枚举选哪个【超时】

    class Solution {
        public long maxAlternatingSum(int[] nums) {
            int n = nums.length;
            long[][] dp = new long[n][2];// 以nums[i]结尾的长度为偶数/奇数的子序列的最大交替和
            dp[0][0] = -1;// 只有一个元素,不存在以其结尾长度为偶数的子序列
            dp[0][1] = nums[0];
            long res = 0L;
            for (int i = 1; i < n; i++){
                dp[i][1] = nums[i];// 以当前元素作为第一个元素
                for (int j = 0; j < i; j++){
                    dp[i][0] = Math.max(dp[i][0], dp[j][1] - nums[i]);          
                    dp[i][1] = Math.max(dp[i][1], dp[j][0] + nums[i]);
                    res = Math.max(res, Math.max(dp[i][0], dp[i][1]));
                }
            }
            return res;
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n 2 ) \mathcal{O}(n^2) O(n2)
      • 空间复杂度: O ( n ) \mathcal{O}(n) O(n)
  • 思路:选或不选

    每个元素可以延续在之前的元素后,此时会受下标奇数和偶数影响;也可以不选择,保留之前的最值。因此可以定义 d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示前 i i i个选了偶数个元素的最大值, d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示前 i i i个选了奇数个元素的最大值

    • 状态转移
      d p [ i ] [ 0 ] = d p [ i − 1 ] [ 1 ] + n u m s [ i ] d p [ i ] [ 1 ] = d p [ i − 1 ] [ 0 ] − n u m s [ i ] dp[i][0]=dp[i-1][1]+nums[i]\\ dp[i][1]=dp[i-1][0]-nums[i] dp[i][0]=dp[i1][1]+nums[i]dp[i][1]=dp[i1][0]nums[i]

    • 优化: d p [ i ] [ 0 / 1 ] dp[i][0/1] dp[i][0/1]定义的是到当前 i i i这个元素为界限,并不意味着必须取 i i i元素,只代表范围区间。

      由于本题中选取子序列,并且不需要根据前一个元素的大小关系判断是否能接在末尾,所以状态定义是定义为截止当目前元素,选取的最大和【有点像背包的感觉,后续元素在前面元素的基础上判断选或不选,保留最大值】

    • 类似不限制买卖次数、只持有一支股票的股票买卖,初始状态拥有一支股票,因此先卖再买再卖再买…求出最后拥有的最大现金值

      • 定义状态:
        • d p [ i ] [ 0 ] dp[i][0] dp[i][0]表示截止第 i i i天,持有股票的最大现金数
        • d p [ i ] [ 1 ] dp[i][1] dp[i][1]表示截止第 i i i天,不持有股票的最大现金数
  • 实现文章来源地址https://www.toymoban.com/news/detail-550541.html

    class Solution {
        public long maxAlternatingSum(int[] nums) {
            int n = nums.length;
            long[][] dp = new long[n][2];// 在nums[0,i]选择长度为偶数/奇数的子序列的最大交替和
            dp[0][0] = 0;// 只有一个元素,不存在以其结尾长度为偶数的子序列
            dp[0][1] = nums[0];
            for (int i = 1; i < n; i++){      
                dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - nums[i]);          
                dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + nums[i]);         
            }
            return Math.max(dp[n - 1][0], dp[n - 1][1]);
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n ) \mathcal{O}(n) O(n)
      • 空间复杂度: O ( n ) \mathcal{O}(n) O(n)

到了这里,关于【每日一题Day262】LC1911最大子序列交替和 | dp的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣算法05】之 _1911_ 最大子序列交替和- python

    一个下标从 0 开始的数组的 交替和 定义为 偶数 下标处元素之 和 减去 奇数 下标处元素之 和 。 比方说,数组 [4,2,5,3] 的交替和为 (4 + 5) - (2 + 3) = 4 。 给你一个数组 nums ,请你返回 nums 中任意子序列的 最大交替和 (子序列的下标 重新 从 0 开始编号)。 一个数组的 子序列

    2024年02月15日
    浏览(39)
  • 【每日一题Day224】LC2517礼盒的最大甜蜜度 | 二分答案

    礼盒的最大甜蜜度【LC2517】 You are given an array of positive integers price where price[i] denotes the price of the ith candy and a positive integer k . The store sells baskets of k distinct candies. The tastiness of a candy basket is the smallest absolute difference of the prices of any two candies in the basket. Return the maximum tastiness of a

    2024年02月07日
    浏览(36)
  • 【每日一题Day95】LC1815得到新鲜甜甜圈的最多组数 | 状态压缩dp 记忆化搜索

    有一个甜甜圈商店,每批次都烤 batchSize 个甜甜圈。这个店铺有个规则,就是在烤一批新的甜甜圈时,之前 所有 甜甜圈都必须已经全部销售完毕。给你一个整数 batchSize 和一个整数数组 groups ,数组中的每个整数都代表一批前来购买甜甜圈的顾客,其中 groups[i] 表示这一批顾客

    2024年02月03日
    浏览(39)
  • 【每日一题Day316】LC449序列化和反序列化二叉搜索树 | BFS

    序列化和反序列化二叉搜索树【LC449】 序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。 设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列

    2024年02月10日
    浏览(40)
  • 【每日一题Day282】LC2681英雄力量 | 排序+数学

    给你一个下标从 0 开始的整数数组 nums ,它表示英雄的能力值。如果我们选出一部分英雄,这组英雄的 力量 定义为: i0 , i1 ,… ik 表示这组英雄在数组中的下标。那么这组英雄的力量为 max(nums[i0],nums[i1] ... nums[ik])2 * min(nums[i0],nums[i1] ... nums[ik]) 。 请你返回所有可能的 非空

    2024年02月14日
    浏览(45)
  • 【每日一题Day168】LC2427公因子的数目 | 模拟

    给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。 简单模拟 感谢力扣 今天还要开会 我恨 感觉习惯真的很容易突然改变 前段时间还是看英文题目的 突然每一天就没有看英文题了 然后这个习惯就没有了

    2023年04月08日
    浏览(42)
  • 【每日一题Day222】LC1110删点成林 | dfs后序

    给出二叉树的根节点 root ,树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合)。 返回森林中的每棵树。你可以按任意顺序组织答案。 又是一段瓶颈期 2023/5/30 思路 遍历树时,如果

    2024年02月07日
    浏览(68)
  • 【每日一题Day281】LC142链表 Ⅱ| 快慢指针 哈希表

    环形链表 Ⅱ【LC142】 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(

    2024年02月15日
    浏览(58)
  • 【每日一题Day266】LC18四数之和 | 排序+双指针

    四数之和【 LC18 】 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且 不重复 的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): 0 = a, b, c, d n a 、 b 、 c 和 d 互不相同 nums[a] + nums[b]

    2024年02月16日
    浏览(39)
  • 【每日一题Day191】LC2423删除字符使频率相同 | 枚举 分类讨论

    给你一个下标从 0 开始的字符串 word ,字符串只包含小写英文字母。你需要选择 一个 下标并 删除 下标处的字符,使得 word 中剩余每个字母出现 频率 相同。 如果删除一个字母后, word 中剩余所有字母的出现频率都相同,那么返回 true ,否则返回 false 。 注意: 字母 x 的 频

    2024年02月01日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包