给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
示例 1:
输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: n = 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
思路:
如果最优结果包含一个因子f>=4,那么你可以将其替换为因子2和f-2,而不会丧失最优性,因为
2*(f-2)=2f-4>=f。如此一来,你便无需使用任何大于或等于4的因子,这意味着你只需要用到1、2和3这三种因子(当然,1是一种浪费,仅会在n=2和n=3时才需用到它。)
python
class Solution:
def integerBreak(self, n: int) -> int:
if n <= 3:
return n - 1
dp = [0] * (n + 1)
dp[2] = 1
for i in range(3, n + 1):
dp[i] = max(2 * (i - 2), 2 * dp[i - 2], 3 * (i - 3), 3 * dp[i - 3])
return dp[n]
自己写的一版:
让所有的拆分数尽可能的相等,这样的乘积是最大的。
python
class Solution:
def integerBreak(self, n: int) -> int:
res = 0
for i in range(2, n // 2 + 1):
base = n // i
baseAddNum = n - base * i
res = max(res, base ** (i-baseAddNum) * ((base + 1) ** baseAddNum))
return res
print(Solution().integerBreak(10))