给定一个正整数 n ,将其拆分为 k正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

 

示例 1:

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

示例 2:

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

 

提示:

  • 2 <= n <= 58
Related Topics
  • 数学
  • 动态规划

  • 👍 735
  • 👎 0
  • 一般分析

    数字n的时候,我们把它分成两份

    1. 小于n的k
    2. n-k
      这两部分

    以k部分固定,想要乘积最大的话,那么 n-k部分内部的乘积需要最大
    那么我们就可以得到这样的分析

    整数n的最大分段乘积为 k 乘以 [n-k]部分的最大分段乘积,从k从 2 取到 n-1,所有的情况都遍历一遍之后取最大值。

    特殊情况

    在执行用例过程中,发现一点特殊情况

    1. 如果被分割出的一部分为2的话,应当直接取2, 显然 2比 1*1 更大,不是么
    2. 当n=6的时候,按照之前的逻辑,因为dp[4] = 4,所以 2 * dp[4] = 8,这是得到的最大值,但是显然最大值应该是 3 * 3 = 9, 那么就存在一种情况下 n/2的平方才是最大值。
    class Solution {
        public int integerBreak(int n) {
            if (n<=2){
                return 1;
            }
            int[] dp = new int[n+1];
            dp[1] = 1;
            dp[2] = 2;
            int i = 2;
            while (++i <= n){
                int j = 1;
                dp[i] = i * i / 4;
                while (++j <= i-1){
                    dp[i] = Math.max(dp[i],j*dp[i-j]);
                }
            }
            return dp[n];
        }
    }