题目简介:
给定一个正整数 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 { |