Leetcode 343.整数拆分

343. 整数拆分

题目

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

1
2
3
4
5
6
7
8
9
10
示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

说明: 你可以假设 n 不小于 2 且不大于 58。

方法

方法1:动态规划

$ i=(i-j) \times j $
$dp[i]=max(dp[i],max(dp[i-j],i-j) \times max(dp[j],j))$

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution(object):
def integerBreak(self, n):
"""
:type n: int
:rtype: int
"""
dp=[0 for i in range(n+1)]
dp[1]=1

for i in range(2,n+1):
for j in range(1,i):
dp[i]=max(dp[i],max(dp[i-j],i-j)*max(dp[j],j))
return dp[n]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def integerBreak(self, n):
"""
:type n: int
:rtype: int
"""
if n==1:
return 0
if n==2:
return 1
if n==3:
return 2
dp=[0]*(n+1)
dp[1]=0
dp[2]=1
dp[3]=2

for i in range(4,n+1):
for j in range(2,i):
dp[i]=max(dp[i],max(dp[i-j],i-j)*j)
# dp[i]=max(dp[i],max(dp[i-j],i-j)*max(dp[j],j))
return dp[n]