此题的子结构还是非常容易发现的,给定一个正整数,将其划分成n个正整数之和,使其的乘积最大。一种直观的子结构就是 遍历1到n,把max(i * dp(n-i))找到。其中一个小陷阱是,由于在做dp的时候默认n-i是一定要划分成多个部分的,所以就忽略了i * (n-i)这种情况,所以我们在遍历的时候还需要考虑i*(n-i)的结果是不是最优的,代码如下:
class Solution(object):
dp = [-1 for _ in range(60)]
dp[1] = 1
dp[2] = 1
def temp(self, n):
if self.dp[n] != -1:
return self.dp[n]
max_value = 0
for i in range(1,n):
tempp1 = i * self.temp(n-i)
tempp2 = i * (n-i)
tempp = max(tempp1, tempp2)
if tempp > max_value:
max_value = tempp
self.dp[n] = max_value
return self.dp[n]
def integerBreak(self, n):
"""
:type n: int
:rtype: int
"""
return self.temp(n)