问题描述:
给定一个正整数
n
,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的
最大
乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
说明: 你可以假设 n
不小于2
且不大于58
。
问题分析:
数学方法,其实这个题目就是求最多可以分出多少个3出来,可以用反证法证明的。
动态规划方法(其实也是用了上面的数学方法):
dp[i] = max(3*dp[i-3], 2*dp[i-2])
Python3实现:
class Solution:
def integerBreak(self, n): # 数学方法
if n < 4: return n - 1
q, r = n // 3, n % 3 # 获取商和余数
if r == 1: # 如果余数为1,那么进一位,变成4
q, r = q - 1, 4
if r == 0:
r = 1
return 3 ** q * r
def integerBreak1(self, n): # dp方法
if n < 4: return n - 1
dp = [0] * (n+1)
dp[2], dp[3] = 2, 3
for i in range(4, n+1):
dp[i] = max(3*dp[i-3], 2*dp[i-2])
return dp[n]
if __name__ == '__main__':
solu = Solution()
print(solu.integerBreak(10))
欢迎指正哦。