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

下面直接进入主题,利用动态规划思路来解决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. MySQL 存储过程初研究
  2. java高级语言特性,Java高级语言特性之注解
  3. vivado中的OOC技术
  4. 1075. PAT Judge (25)
  5. 利用人工智能分析视频行为
  6. 关于主数据管理及病人主索引的说明
  7. 高数 | 一点可导和邻域内可导能推出来什么?
  8. 移动磁盘显示文件系统损坏的资料寻回方案
  9. 林轩田机器学习 | 机器学习技法课程笔记10 --- Random Forest
  10. HTML中添加超链接、音频标签、视频标签、内嵌框架标签
  11. 计算机c盘空间满了应该怎么办,C盘空间满了怎么办?我来教你你如何解决
  12. 批处理之读写ini配置文件
  13. 高斯模糊与图像失焦,附Python代码实现
  14. t3软件怎么生成报表_t3财务报表
  15. GAMES101笔记_Lec07~09_着色 Shading
  16. 安卓逆向工程--针对授权key方式的破解
  17. 不要妄图一夜实现「智能」,这里有AI工业落地几乎必遇的「深坑」
  18. Android 滚动字幕实现
  19. 【ST开发板评测】Nucleo-F411RE开箱报告
  20. matlab动态文字,matlab GUI界面文字动态显示

热门文章

  1. 最值得学的编程语言是哪个?
  2. docker之部署mall开源项目
  3. Redis缓存(二)缓存淘汰策略,脏数据/脏页,缓存污染
  4. 中国机器人大赛之中型组仿真比赛程序
  5. 如何实现IEEE1588 高精度时间同步
  6. Centos7配置阿里云yum源及epel源
  7. 钢材规格解读的软件_钢材重量计算软件下载-钢材重量手册2020版下载 v3.71免费版--pc6下载站...
  8. HTTP请求错误码大全
  9. Win7 瘦身 winsxs文件夹
  10. python---mysql批量插入数据