leetcode_343 整数拆分

148 阅读1分钟

要求

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

示例 1:

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

示例 2:

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

核心代码

class Solution:
    def integerBreak(self, n: int) -> int:
        if n <= 3:
            return n - 1
        dp = [0] * (n + 1)
        dp[1:4] = [1,2,3]
        for i in range(4,n + 1):
            dp[i] = max(2 * dp[i - 2], 3 * dp[i - 3])
        return dp[n]

image.png

重点问题

解题思路:

这是一道动态规划的问题,n<=3时,返回n-1
当n>=4时,最大乘积一定是由k个2和m个3组成的
dp[i]表示i拆分后的最大乘积,其中i>=4, 为了dp[4],dp[5],dp[6]能正常计算,需要初始化dp[0]=0,dp[1]= 1,dp[2]=2,dp[3]=3
状态转移矩阵为dp[i] = max(dp[i-2] * 2 , dp[i-3] * 3)

对上面的思路进行分析,[0,1,2,3] 前四位是这样的,就是原始元素进行占位,当我们看dp(4) = max(2 * dp(2), 3 * dp(1)) = 4,dp(5) = max(2 * dp(3), 3 * dp(2)) = 6,dp(6) = max(2 * dp(4), 3 * dp(3)) = 9,以此类推我们能发现,我们的数字都可以使用前面的数字加上个2或者3来解决,这就是上面,最大乘积一定是由k个2和m个3组成的来由,应为前面得到的数值我们都保证了一定是最大的,后面实际上直接用也是没有问题的,比较好的一道题。