当前位置:   article > 正文

(力扣---动态规划)整数拆分_力扣 一个数刚好被拆n个数拆完

力扣 一个数刚好被拆n个数拆完

(力扣—动态规划)整数拆分

问题描述

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

示例 1:

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

示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。

思想

我知道很多人碰到这种题喜欢找规律,确实有规律,规律就是:能拆成用2组成的就都用2组成,否则就用3。
但是这种问题有规律可循,如果碰到规律不好找的咋办?
所以规律这种事情,除非明眼能看出来的,其余就玩儿玩儿就好。
那这道题怎么用dp解决呢?
这道题的难点在于 我们不知道究竟要将一个数拆成多少份相乘能最大,但是我们知道无论拆成多少份,其和一定是不变的
也就是说 化繁求简,我们将拆成n(n不确定)份转化成拆成两份,然后各自再拆成两份,直到最后n是1也就是1。
简单点说 比如一个数据n,我们将它拆成 MAX(i) * MAX(n - i),找出结果最大的那个就行了,而MAX(i)、MAX(n - i)分别对应数据以i、n - i为和时最大的结果,MAX(i) * MAX(n - i)就是 i + n - i = n时的乘积最大结果。
所以dp方程是:dp[i] = max(dp[i], max(j, dp[j]) * max(i - j, dp[i - j]))
可能有人不太理解这个dp方程,下面先贴代码,之后再解释

python code
class Solution:
    def integerBreak(</
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/709819
推荐阅读
相关标签
  

闽ICP备14008679号