Given a positive integer n, break it into the sum of atleast two positive integersand maximize the product of those integers. Return the maximum product you canget.
For example, given n =2, return 1 (2 = 1 + 1); given n =10, return 36 (10 = 3 + 3 + 4).
Note: You may assume that n isnot less than 2 and not larger than 58.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creatingall test cases.
这一题一般的解法为使用DP,建立一个数组Dp,Dp[i]表示数字i拆分成至少两个数这些数的积中最大的一个值,这里需要注意的是,Dp[2] = 0,因为2不能拆分成两个数,然后可以得到递归关系,Dp[n] = max(Dp[n - t] * t,(n – t) * t) : t = 1,2,3…n-1
这里之所以有两项是因为Dp[n – t]表示的是n – t拆分成至少两项之后最大的乘积,并不包括把n – t刚好拆分成两项的乘积,Dp[n -t] * t表示的是把n拆分成至少三项之后的最大乘积,并不包括把n拆分成两项之后的最大乘积
class Solution(object):
def integerBreak(self, n):
tmp = 0
ttmp = 0
dp = [0 for i in range(60)]
dp[1] = 0
dp[2] = 1
for i in range(3, n + 1):
for j in range(1, n):
tmp = max((i - j) * j, dp[i - j] * j)
ttmp = max(tmp, ttmp)
dp[i] = ttmp
return dp[n]
不过这一题还有一个最简便的方法,就是可以证明n拆分成多个数之后,要使得他的乘积最大,拆分成的每个数都只能是2或者是3,因为有这么个公式(a1 + a2+…an)/n >= 2√(a1 * a2 * a3… * an),
也就是说把,把n拆分成相等的数的时候乘积最大
假设拆分之后的每个数都是x,
则q(x) = x^(n / x),q(m)的导数为n * xn/x-2 * (1 - ln(x)).
可以知道,当x为e也就是大约2.7的时候积最大,但是x只能是整数,所以x只能是2或者是3
不过这种方法比赛中肯定想不出来,只能是算作拓展知识点