DP进阶之路——整数拆分

343. 整数拆分

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

示例 1:

输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

这种题目,我们第一眼肯定都是直接原地暴力破解,直接利用回溯去试一下 

 

class Solution {int max;int sum = 1;public int integerBreak(int n) {if(n == 2)  return 1;if(n == 3)  return 2;max = Integer.MIN_VALUE;dfs(n);return max;}void dfs(int n){if(n<0) return;if(n == 0){max=Math.max(max,sum);return;}for(int i =1;i<= n && n>0;i++){sum = sum*i;dfs(n-i);sum = sum/i;}}
}

结果很遗憾,经典时间超限。所以我们可以来进行优化一下。

可以通过记录我们已经运行过了乘积,免去多余的运行(可以说是剪枝) 

 

class Solution {public int integerBreak(int n) {if (n == 2) return 1;    if (n == 3) return 2;    //这里是两种的特殊情况return dfs(n, new int[n + 1]);}private int dfs(int n, int[] memo) {    //这里的memo数组就是用来记录运行过的if (n == 2) return 2;if (memo[n] > 0) return memo[n];    //如果大于0,就是已经被记录了,直接返回就行int max = 0;for (int i = 1; i < n; i++) {max = Math.max(max, i * Math.max(n - i, dfs(n - i, memo)));}memo[n] = max;return max;}
}

一运行,我们就发现我们过了。然后,我们还可以通过递推优化,就是动态规划。

我们先要确定:dp[i] 是什么,其实是n == i时候的拆分出来的整数的最大乘积。

提出一个问题,这个怎么求出来呢?

 

 

我们其实可以有两种方式获得dp[i]

第一种:i*(n-i)        这是两个数直接求

第二种:i*(dp[n-i])        这里是和多个数求

class Solution {public int integerBreak(int n) {int[] dp = new int[n+1];dp[0] = dp[1] = 0;for(int i =2;i<=n;i++){int temp = 0;for(int j = 1;j<= i;j++){temp = Math.max(Math.max(j*(i-j),j*dp[i-j]),temp);//这里是比较两种求值的所有情况,最后获得最大值}dp[i] = temp;}return dp[n];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305585.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu fcitx Install

ubuntu经常出现键盘失灵的问题 查询资料得知应该是Ibus框架的问题 于是需要安装fcitx框架和搜狗拼音 sudo apt update sudo apt install fcitx 设置fcitx开机自启动&#xff08;建议&#xff09; sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ 然后…

js_常用事件演示

✨前言✨ 1.如果代码对您有帮助 欢迎点赞&#x1f44d;收藏⭐哟 后面如有问题可以私信评论哟&#x1f5d2;️ 2.博主后面将持续更新哟&#x1f618;&#x1f389;文章目录 &#x1f354;一、在JavaScript中什么是事件&#xff1f;&#x1f35f;二、为什么要使用事件&#x…

elasticsearch系列七:聚合查询

概述 今天咱们来看下es中的聚合查询&#xff0c;在es中聚合查询分为三大类bucket、metrics、pipeline&#xff0c;每一大类下又有十几种小类&#xff0c;咱们各举例集中&#xff0c;有兴许的同学可以参考官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/refere…

产品管理-学习笔记-版本的划分

版本号说明【X.Y.Z_修饰词】 版本号定义原则X表示大版本号&#xff0c;一般当产品出现重大更新、调整、不再向后兼容的情况时我们会在X上加1Y表示功能更新&#xff0c;在产品原有的基础上增加、修改部分功能&#xff0c;且并不影响产品的整体流程或业务Z表示小修改&#xff0c…

Apache OFBiz groovy 远程代码执行漏洞(CVE-2023-51467)

项目介绍 Apache OFBiz是一个非常著名的电子商务平台&#xff0c;是一个非常著名的开源项目&#xff0c;提供了创建基于最新J2EE/XML规范和技术标准&#xff0c;构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类WEB应用系统的框架。 OFBiz最主要的特…

(04730)半导体器件之基本放大器工作原理(三)

本文主要阐述多级与差动放大器 为使输入的微弱信号进行放大后能获得足够的输出功率去推动负载运行&#xff0c;往往要采用所谓的多级放大电路&#xff0c;信号逐级通过放大&#xff0c;直至得到输出信号。这就必须考虑放大电路级与级之间的信号传递方法&#xff0c;或者称为耦…

数据库进阶教学——主从复制(Ubuntu22.04主+Win10从)

目录 一、概述 二、原理 三、搭建 1、备份数据 2、主库配置Ubuntu22.04 2.1、设置阿里云服务器安全组 2.2、修改配置文件 /etc/my.cnf 2.3、重启MySQL服务 2.4、登录mysql&#xff0c;创建远程连接的账号&#xff0c;并授予主从复制权限 2.5、通过指令&#xff0c;查…

Vue - Class和Style绑定详解

1. 模板部分 <template><div><!-- Class 绑定示例 --><div :class"{ active: isActive, text-danger: hasError }">Hello, Vue!</div><!-- Class 绑定数组示例 --><div :class"[activeClass, errorClass]">Cla…

MySQL查找配置文件的3种方法(Windows)

方法一&#xff1a; 查找根目录 SELECT basedir; 方法二&#xff1a; 查找数据目录 SELECT datadir; 方法三&#xff1a; 文件属性查询“defaults-file”

51单片机(STC8)-- GPIO输入输出

文章目录 I/O口相关寄存器端口数据寄存器端口模式配置寄存器&#xff08;PxM0&#xff0c;PxM1&#xff09;端口上拉电阻控制寄存器(PxPU)关于I/O的注意事项 配置I/O口I/O设置demoI/O端口模式LED控制&#xff08;I/O输出&#xff09;按键检测&#xff08;I/O输入&#xff09; S…

Qt(二):使用udp发送与接收图片

使用Qt来通过UDP协议发送和接收图片可以分为几个步骤。以下是一个基本的指南&#xff1a; 发送图片准备图片数据&#xff1a;首先&#xff0c;你需要将图片转换为可以在网络上传输的数据格式。通常&#xff0c;这涉及到将图片转换为字节数组。设置UDP套接字&#xff1a;在Qt中…

拓扑排序图解-Kahn算法和深度优先搜索

拓扑排序 是将一个有向无环图中的每个节点按照依赖关系进行排序。比如图 G G G存在边 < u , v > <u,v> <u,v> 代表 v v v的依赖 u u u, 那么在拓扑排序中&#xff0c;节点 u u u一定在 v v v的前面。 从另一个角度看&#xff0c;拓扑排序是一种图遍历&#…