整数拆分
题目描述
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
解题思路
1. 动态规划
设
表示正整数
,被拆分为至少两个正整数后的最大乘积。
那么
假设
首先可以拆成
。则有以下两种情况:
- 将 分为 和 的,且 不能再被分了。此时的乘积就是
- 将
拆分成
和
的和,且
继续拆分成多个正整数,此时的乘积是
所以, 。因为j的范围为 , 所以需要遍历j求最大的dp[i]。
动态转移方程如下:
def integerBreak(self, n: int) -> int:
dp = [0 for i in range(n+1)]
# print(dp)
for i in range(2,n+1):
for j in range(1,i):
dp[i] = max(dp[i],j * (i-j),j * dp[i-j])
return dp[n]
总结:时间复杂度为O(n^2),不咋优秀
2. 用数学方法解题
有推论:将数字n尽可能以因子3等分时,乘积最大。
推理的具体过程见链接: https://leetcode-cn.com/problems/integer-break/solution/343-zheng-shu-chai-fen-tan-xin-by-jyd/.
还没写完。。。
references
[1] https://leetcode-cn.com/problems/integer-break/solution/343-zheng-shu-chai-fen-tan-xin-by-jyd/.
[2] https://leetcode-cn.com/problems/integer-break/