这道题观察出规律是关键!上来一看并没有什么头绪,多列一些数你就会发现出现了规律
# encoding = 'utf - 8'
# 动态规划
# 2 = 1 + 1 -> 1 * 1 = 1
# 3 = 1 + 2 -> 1 * 2 = 2
# 4 = 2 + 2 -> 2 * 2 = 4
# 5 = 2 + 3 -> 2 * 3 = 6
# 6 = 3 + 3 -> 3 * 3 = 9
# 7 = 3 + 4 -> 3 * 4 = 12
# 8 = 2 + 3 + 3 -> 2 * 3 * 3 = 18
# 9 = 3 + 3 + 3 -> 3 * 3 * 3 = 27
# 10 = 3 + 3 + 4 -> 3 * 3 * 4 = 36
# 11 = 3 + 3 + 3 + 2 -> 3 * 3 * 3 * 2 = 54
# 12 = 3 + 3 + 3 + 3 -> 3 * 3 * 3 * 3 = 81
# 除开n <= 4的情形,其他情况可用以下规律来描述,对于n的最大分拆乘积,记为f[n],则有:
#
# f[n] = max(2 * f[n - 2], 3 * f[n - 3])
class Solution(object):
def integerBreak(self, n):
"""
:type n: int
:rtype: int
"""
if n <= 3:
return n - 1
res = [0 for i in range(n + 1)]
# 这两个赋值有技巧,并不是2,3对应的最大乘积
res[2] = 2
res[3] = 3
for i in range(4,n + 1):
res[i] = max(2 * res[i - 2],3 * res[i - 3])
return res[n]