1. question: 整数拆分(中等)
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/integer-break
示例 1:
1 | 输入: n = 2 |
示例 2:
1 | 输入: n = 10 |
提示:
1 | 2 <= n <= 58 |
2. answers
这道题最开始没想出来,思路明显和爬楼梯以及不同路径不一样,这两道题是物理上的动态规划,即前一步都是实实在在存在的,即题目中指明了递推公式。而本道题,则是逻辑上的动态规划,题目中没有指明递推公式。
首先,题目要求是一个数,可拆分成至少两个数,并且其乘积最大。显然,最少是两个数,那么这两个数,一定是在自己的基础上是最优的,即这两个数,要么本身最大,要么是可以继续拆分成两个数,使得乘积最大。
我们知道,既然一个数可以拆分成两个子数(最优),那么这两个子数一定是小于本数的,而子数可以继续拆分,求解其最优的。继续下去,直到子数不能拆分为止。这就是递推公式。每个数N,它的最优解都是从[2, N]中的可能子数最优解中选取的,比如(1, n-1),(2, n-2),(3, n-3),(4, n-4)等等,而我们只需要将1,2,3…n-1的最优解都计算出来即可,在计算的过程中,每个值都取决于前面的最优解,这就是递推公式,Max(n) = Max((1, n-1), (2, n-2), ...)
。
所以,从2开始,到N,遍历每个数,计算其最优解。这样,后续的每个数,都可以使用前面的结果。代码如下所示:
1 | public class Solution_0116_02 { |
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com),代码随想录 (programmercarl.com)。