【算法】Greatest Sum Divisible by Three 可被三整除的最大和- 动态规划

news/2024/11/29 22:54:59/

文章目录

  • Greatest Sum Divisible by Three 可被三整除的最大和-动态规划
    • 问题描述:
    • 分析
    • 代码
    • Tag

Greatest Sum Divisible by Three 可被三整除的最大和-动态规划

问题描述:

给你一个整数数组 nums,请你找出并返回能被三整除的元素最大和。

nums.length 范围[1,40000] , n u m s [ i ] nums[i] nums[i] 范围[1,10000]

分析

贪心策略的减法,虽然时间复杂度和操作性简单,但是适用性并不广泛。
以01背包的思路来思考这个问题,对于 a [ i ] a[i] a[i]来说,如果选择,而 a [ i ] m o d 3 = = k a[i]\mod3==k a[i]mod3==k,即 k = 0 , 1 , 2 k=0,1,2 k=0,1,2.
如果 k=0,需要找到 0 → i − 1 0\rightarrow i-1 0i1的最大和 s m o d 3 = = 0 s\mod3==0 smod3==0
如果 k=1,需要找到 0 → i − 1 0\rightarrow i-1 0i1的最大和 s m o d 3 = = 2 s\mod3==2 smod3==2
如果 k=2,需要找到 0 → i − 1 0\rightarrow i-1 0i1的最大和 s m o d 3 = = 1 s\mod3==1 smod3==1
如果不选
当前的位置就对应 a [ 0 ] → a [ i − 1 ] a[0]\rightarrow a[i-1] a[0]a[i1]的最大和s。
用$f[i][j] $表示 前 0 → i − 1 0\rightarrow i-1 0i1个元素可以得到的最大和 s s s,并且 s m o d 3 = = j s\mod3==j smod3==j .
令a[i] = x
不选a[i], f [ i ] [ j ] = f [ i − 1 ] [ j ] f[i][j]=f[i-1][j] f[i][j]=f[i1][j]
选a[i], f [ i ] [ j ] = f [ i − 1 ] [ ( j − x ) m o d 3 ] f[i][j]= f[i-1][(j-x)\mod3] f[i][j]=f[i1][(jx)mod3]

( s + x ) m o d 3 = = j 转换 s m o d 3 = = ( ( j − x ) m o d 3 + 3 ) m o d 3 (s+x)\mod 3==j \\ 转换\\ s\mod 3 == ((j-x)\mod 3 + 3)\mod 3 \\ (s+x)mod3==j转换smod3==((jx)mod3+3)mod3
所以状态转移方程就长这个样子。

f [ i ] [ j ] = max ⁡ ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ ( ( j − x ) m o d 3 + 3 ) m o d 3 ] + a [ i ] ) f[i][j] = \max (f[i-1][j],f[i-1][((j-x)\mod3+3)\mod 3] + a[i] ) f[i][j]=max(f[i1][j],f[i1][((jx)mod3+3)mod3]+a[i])
如果这个方程看不明白,也可以换个角度。
f [ i ] [ j ] f[i][j] f[i][j]定义不变
f [ i + 1 ] [ j ] = f [ i ] [ j ] f[i+1][j] = f[i][j] f[i+1][j]=f[i][j]
f [ i + 1 ] [ j ] = f [ i ] [ ( j m o d 3 + x m o d 3 ) m o d 3 ] f[i+1][j] = f[i][(j\mod3+x\mod3) \mod 3] f[i+1][j]=f[i][(jmod3+xmod3)mod3]
f [ i + 1 ] [ j ] = max ⁡ ( f [ i ] [ j ] , f [ i ] [ ( j + a [ i ] ) m o d 3 ] + a [ i ] ) f[i+1][j] = \max (f[i][j],f[i][(j+ a[i])\mod3] + a[i] ) f[i+1][j]=max(f[i][j],f[i][(j+a[i])mod3]+a[i])
为了方便计算,对原始下标做一次偏移,初始化边界 f [ 0 ] [ 0 ] = 0 , f [ 0 ] [ 1 ] = I N T M I N , f [ 0 ] [ 2 ] = I N T M I N f[0][0]=0,f[0][1]=INTMIN,f[0][2]=INTMIN f[0][0]=0,f[0][1]=INTMIN,f[0][2]=INTMIN。即 f [ i ] f[i] f[i]表示对原数组的 a [ i − 1 ] a[i-1] a[i1]元素进行处理。

代码

class Solution {public int maxSumDivThree(int[] nums) { int n = nums.length;int[][] f = new int[n + 1][3];f[0][1] = f[0][2] = Integer.MIN_VALUE;for (int i = 1; i <= n; i++){ for (int j = 0; j < 3; j++){ f[i][j] = f[i-1][j];int pre = ((j-nums[i-1])%3+3)%3;f[i][j] = Math.max(f[i][j],f[i-1][pre] + nums[i-1]);}}         return f[n][0]; }
}

时间复杂度O(Nk)

空间复杂度O(Nk)

public int maxSumDivThree(int[] nums) { int n = nums.length;int[][] f = new int[n + 1][3];f[0][1] = f[0][2] = Integer.MIN_VALUE;for (int i = 0; i < n; i++){ for (int j = 0; j < 3; j++){  int pre = (j+nums[i])%3;f[i+1][j] = Math.max(f[i][j],f[i][pre] + nums[i]);}}         return f[n][0]; }

时间复杂度O(Nk)

空间复杂度O(Nk)

因为状态转移方程的特点,空间可以进一步压缩,使用滚动数组可以把空间压缩到 O ( k ) O(k) O(k)

Tag

Array Dynamic Programming


http://www.ppmy.cn/news/537187.html

相关文章

大模型高效微调综述下: DiffPruning、BitFit、LoRa、AdaLoRA、MAM Adapters、UniPELT

文章目录 四、Selective Methods4.1 DiffPruning&#xff08;2020.10&#xff09;4.2 BitFit&#xff08;2021.6&#xff09;4.3 Freeze and Reconfigure (FAR&#xff0c;2022)4.4 FishMask&#xff08;略&#xff09; 五、Reparametrization-based methods&#xff08;重参数…

C++入门:类和对象(后)

目录 前言&#xff1a; 一&#xff1a;static成员 (1)概念 (2)特性 (3)例子 二&#xff1a;explicit关键字 三&#xff1a;内部类 (1)概念 (2)特性 (3)实例 四&#xff1a;匿名对象 (1)概念 (2)特性 (3)实例 五&#xff1a;拷贝对象时的一些编译器优化 (1)引入 …

012-从零搭建微服务-接口文档(二)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;https://gitee.com/csps/mingyue 源码地址&#xff08;前端&#xff09;&#xff1a;https://gitee.com/csps…

SVN教程

SVN使用教程总结 SVN简介&#xff1a; 为什么要使用SVN&#xff1f; 程序员在编写程序的过程中&#xff0c;每个程序员都会生成很多不同的版本&#xff0c;这就需要程序员有效的管理代码&#xff0c;在需要的时候可以迅速&#xff0c;准确取出相应的版本。 Subversion是什么&am…

【裸机开发】IRQ 中断服务函数(二)—— 全局中断初始化

实现了 IRQ 中断服务函数的汇编部分以后&#xff0c;接下来我们要使用C代码实现IRQ中断服务函数的具体逻辑&#xff0c;主要包含初始化和中断处理两部分。 全局中断初始化&#xff08;全局中断使能、IRQ中断使能&#xff09;具体中断处理逻辑实现 目录 一、全局中断初始化&am…

为什么要写这个带点玄幻气息的英语单词记忆博客

&#x1f31f;博主&#xff1a;命运之光 ☀️专栏&#xff1a;英之剑法&#x1f5e1; ❤️‍&#x1f525;专栏&#xff1a;英之试炼&#x1f525; ☀️博主的其他文章&#xff1a;点击进入博主的主页 &#x1f433; 开篇想说的话&#xff1a;开学就大三了&#xff0c;命运之光…

局域网聊天连接全集

布谷鸟2008 局域网聊天工具2008 5.01 下载- 华军软件园- 网络工具 ... 《布谷鸟2008 第二版》局域网聊天通讯办公软件&#xff0c;免费使用&#xff0c;无须注册。可实现局域网络间跨网段的聊天、群聊、和传送文件外&#xff0c;还包括&#xff1a;“日程安排”“通讯录”“个人…

公司禁用QQ之旅

公司要求上班时间禁止使用QQ等聊天工具&#xff0c;刚开始时想着直接把QQ使用的端口禁用掉&#xff0c;真正去实施时就发现问题来了&#xff0c;BT的腾讯&#xff0c;居然使用的是4000&#xff0c;8000&#xff0c;80端口&#xff0c;晕死&#xff0c;这些端口还真的关不得&…