题目简介:
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
1 | 输入: 2 |
示例 2:
1 | 输入: 10 |
说明: 你可以假设 n 不小于 2 且不大于 58。
思路:
动态规划,dp[i]
代表正整数i
,拆分为至少两个正整数的和,并使这些整数的乘积最大化,可以获得的最大乘积。
所以对于一个正整数i >= 2
,乘积的最大值存在以下两种情况:
- 将
i
分为j, i - j
,并且i - j
不再分离,此时乘积为j * (i - j)
。 - 将
i
分为j, i - j
,并把i - j
继续分离,此时乘积为j * dp[i - j]
。
所以我们只要遍历j
,从1 ~ i - 1
,在过程中记录最大值,最后赋值给dp[i]
即可。
最后返回dp[n]
即可。
tip:
dp[0] = dp[1] = 0
。(不可分离)
代码如下:
1 | class Solution { |