GuilinDev

Lc0343

05 August 2008

343. Integer Break

给一个正整数n,分成k个正整数,k个正整数加起来等于n,同时保证k个正整数的乘积最大,返回这个乘积

dp[i]表示当 总值为i的时候,可以求得的最大组合乘积。

i=6,dp[6]则表示凑成和为6的大于俩个数的乘积最大值

因此我们的目的是求dp这个数组,返回dp[n]

对于每一个i,枚举它的可能组成(其中j < i),拆成俩个数的乘积就是j * (i-j),而拆成多个数的乘积则是(i - j) * dp[i - j] 然后取得这些枚举位置中的最大结果,保存为dp[i]

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
    public static int integerBreak(int n) {
        int[] dp = new int[n + 1];
        //dp[0] = dp[1] = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j < i; j++) {
                dp[i] = Math.max(dp[i], Math.max((i - j) * dp[j], (i - j) * j));
            }
        }
        return dp[n];
    }
}