LeetCode343. 整数拆分

题目

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

示例 1:

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

示例 2:

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

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

 分析

n=10的话,那么两个数相加为10的可能性有9种,1+9 , 2+8, 3+7, 4+6, 5+5, 6+4, 7+3, 8+2, 9+1,在这里面1+9和9+1这种是重复的,有4个重复的,去掉重复的九还剩下:

1+9 , 2+8, 3+7, 4+6, 5+5 这些。然而题目的要求并不只单单是两数相加。

我们可以这样 继续算 1 + 9 ,1不可以再拆分, 9 = 1+8 =2+7 =3+6 = 4+5 ,

同时2+8, 3+7, 4+6, 5+5 这些也像上面拆分,拆分后的还可以继续拆分,拆分,

那么我们到最后呢 可以发现

如果n=10的话,其实我们只要知道1 2 3 4 5 6 7 8 9的最大乘积是多少,然后算一下1+9 , 2+8, 3+7, 4+6, 5+5 他们当中的最大乘积。

扫描二维码关注公众号,回复: 3785884 查看本文章

思路简单的说就是,我们从1开始依次推后面数字的最大乘积。

注意啦 题目的要求是没有n=0+n这种拆法的哦~

代码

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n+1];
        dp[1]=1;
        for (int i = 2; i < n+1; i++) 
            for (int j = 1; j < i/2+1; j++)
                dp[i] = Math.max(Math.max(dp[j],j)*Math.max(dp[i-j],(i-j)),dp[i]);
            
        return dp[n];
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38595487/article/details/83510537