题目
难度:★★★☆☆
类型:数组
方法:数学
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n 不小于 2 且不大于 58。
解答
方法1:动态规划
首先我们用动态规划讨论这个问题。
创建数组dp,长度是n+1,dp[i]表示数字i拆分后加数最大乘积;将前两个数字初始化为0,因为零和1都不能拆分。
从数字2开始遍历,一直到数字n,设当前遍历到的数字为i,
为了获得数字i拆分后加数最大乘积,我们需要借助dp[0:i]的结果,有两种情况:
对于一个小于i的数字j,我们可以选择将i拆分为i-j和j两部分,此时的加数乘积为j(i-j);
我们也可以选择将i-j继续拆分,此时的加数乘积为jdp[i-j]
j的取值范围是从零到i-1都要取到,也就是所有大于等于零小于i的整数,因此需要增加一重循环。
最后返回最后一个元素dp[-1]即可。
class Solution:
def integerBreak(self, n: int) -> int:
dp = [0] * (n + 1