对于动态规划的思路,在这就不多说了,需要理解的看下这一篇文章动态规划步骤​​​​​​,

下面直接进入主题,利用动态规划思路来解决343. 整数拆分 - 力扣(LeetCode)。

第一步、确定数组dp,创建保存整数拆分之后得到的最大乘积的数组。

# 确定数组的长度,每次拆分的计算结果是为上一次的最大乘积,作为占位符。
dp = [0] * (n+1)  

第二步、确定数组dp的初始值。

从题中可以知道,所以在拆分 n == 0 or n == 1, 是没有意义的,很显然,我们拆分n == 2时,可以得出2 = 1 + 1,所以最大乘积为1, 即dp[2] = 1,后续的计算乘积结果也是基于dp[2]的结果。

dp[2] = 1

第三步、确定状态转移方程。dp[i] = max(dp[i], j * (i-j), j * dp[i - j])  

我们可以通过一个简单实例来解释一下,当 n = 5时,dp数组保存每一个整数拆分得到的最大乘积的值。

需要注意几个问题,

1、拆分问题:我们需要拆分整数两个或两个以上的整数进行相加等于原数,且拆分后的数值相乘得到的乘积最大。所以需要考虑拆分两个正整数之后拆分和不拆分,

1)将 i 拆分成 j 和 i−j 的和,且 i−j 不再拆分成多个正整数,此时的乘积是 j * (i-j)

2) 将 i 拆分成 j 和 i−j 的和,且 i−j 继续拆分成多个正整数,此时的乘积是 j * dp[i-j],此时,我们就需要dp数组中之前的值进行调用。

2、j 是从1 开始遍历,i-j 可以这么理解就是将需要拆分的n的数值减去对应的 j 的遍历值,

j * (i - j)也就是拆分两个整数的乘积。

3、我们需要比较 j * (i - j),j * dp[i-j]的乘积的最大。

所以,状态转移方程为:dp[i] = dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));

for i in range(3, n + 1):for j in range(1, i - 1):dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))

第四步、确定遍历顺序。

dp[i] 是依靠 dp[i - j]的状态,所以遍历i一定是从前向后遍历,i是从3开始,枚举j的时候,是从1开始的。这样dp[i - j]就是dp[2]正好可以通过我们初始化的数值求出来。

第五步,用 n = 5举例,可以通过上表进行推导。

python代码展示:

def integerBreak(n):dp = [0] * (n + 1)dp[2] = 1for i in range(3, n + 1):for j in range(1, i - 1):dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j]))return dp[n]
print(integerBreak(5))

动态规划 - 整数拆分相关推荐

  1. 美团面试动态规划——整数拆分

    dp[i]代表i这个数拆分后所能得到的最大乘积 class Solution {public:int integerBreak(int n) {vector<int> dp(n+1,0); ...

  2. 343. 整数拆分 golang 动态规划

    题目 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 ...

  3. LeetCode-动态规划基础题-343. 整数拆分

    描述 343. 整数拆分 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获得的最大乘积. 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 ...

  4. leetcode 343. Integer Break | 343. 整数拆分(Java)

    题目 https://leetcode.com/problems/integer-break/ 题解 一开始以为,只要是 3 个数相加就可以,于是在错误的方向上越走越远: 后来发现并不只是 3 个数, ...

  5. leetcode - 343. 整数拆分

    343. 整数拆分 -------------------------------------------- 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化. 返回你可以获 ...

  6. 【算法】整数拆分问题

    1. 概述 给定一个整数n,将n拆分,问一共有多少种拆分方法. 整数拆分是很经典的问题.也是很经典的 "动态规划" 问题. 问题分析 1 = 12 = 2 = 1 + 13 = 3 ...

  7. 整数拆分问题的四种解法

    整数划分问题是算法中的一个经典命题之一 所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+m3+....+mi;(其中mi为正整数,并且1<=mi<=n),则{m1,m2,m ...

  8. 动态规划法求解整数拆分问题

    问题描述 求将正整数n无序拆分成最大数为k(称为n的k拆分)的拆分方案个数,要求所有的拆分方案不重复. 问题求解 设n=5,k=5,对应的拆分方案有: 为了防止重复计数,让拆分数保持从大到小排序.正整 ...

  9. 剑指Offer 14- I. 剪绳子(Medium)/ 剪绳子 II(Medium)/ 343. 整数拆分(Medium)

    剑指Offer 14- II. 剪绳子 II(Medium) 343. 整数拆分(Medium) [题目连接] 题解 剪绳子(数学推导 / 贪心思想,清晰图解) 图解[暴力递归][记忆化技术][动态规 ...

最新文章

  1. 12岁AI开发者现身DuerOS发布会:得开发者得天下
  2. vue 数组删除 dome没更新_详解Vue响应式原理
  3. 禁止苹果手机默认行为(阻止页面的滚动)
  4. 【鉴权/授权】一步一步实现一个简易JWT鉴权
  5. android logcat 根据包名过滤,adb logcat通过包名过滤(dos命令find后跟变量)
  6. 最全机器学习种类讲解:监督、无监督、在线和批量学习都讲明白了
  7. 编程语言“鄙视链” +1?亚马逊力捧 Rust,Go 技术负责人连发 14 条推特抵制“拉踩”...
  8. redis 的mq功能演示
  9. php 无法识别oci8,php 连接oracle 无法 启用oci8 解决办法 (摘自oracle官网)
  10. MATLAB深度学习代码详细分析(一)__nnff.m
  11. 计算机vb基础知识,计算机VB基础知识---知识导学.doc
  12. Java兔子生兔子问题
  13. 小程序中打开pdf文件(wx.downloadFile+wx.openDocument)
  14. 安徽专升本计算机专业基础柳青版课后习题答案
  15. 25.优化算法4:求解信赖域子问题及其收敛性
  16. java水费管理系统课程设计_java水电费管理系统
  17. 21世纪以来14起最大的数据泄露事件
  18. 基于动力学模型的无人驾驶车辆MPC轨迹跟踪算法及carsim+matlab联合仿真学习笔记
  19. 电商项目抢购压测实例
  20. 优化算法之梯度下降法、牛顿法、拟牛顿法和拉格朗日乘数法

热门文章

  1. 7 linux 配置链路聚合_linux – 在智能交换机上设置链路聚合组(L...
  2. redis常用linux指令(无介绍快使用)
  3. 嵌入式--基于AD15的原理图及PCB绘制基础知识
  4. 沟通CTBS V5.0确保立白集团核心数据万无一失
  5. 建筑CAD软件导出超大T3或T8格式图纸时卡顿怎么办?
  6. java 聊天室开源_用java WebSocket做一个聊天室
  7. SQL 行转列 和 列转行 整理
  8. java基于springboot宠物医院管理系统
  9. 基于博通bcm2835芯片手册进行简单的树莓派引脚驱动
  10. 根据PPG估算血压利用频谱谱-时间深度神经网络【翻】