给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。
示例2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 ×3 ×4 = 36。
说明: 你可以假设n不小于 2 且不大于 58。
package com.loo;
public class IntegerSplit {
public static void main(String[] args) {
int n = 10;
System.out.println(getMaxIntegerSplitMultiply1(n));
System.out.println(getMaxIntegerSplitMultiply2(n));
System.out.println(getMaxIntegerSplitMultiply3(n));
}
// 动态规划
public static int getMaxIntegerSplitMultiply1(int n) {
if (n < 4) {
return n - 1;
}
int[] dp = new int[n+1];
dp[0] = dp[1] = 0;
for (int i=2;i<=n;i++) {
int curr = 0;
for (int j=1;j<i;j++) {
curr = Math.max(curr, Math.max(j*(i-j), j*dp[i-j]));
}
dp[i] = curr;
}
return dp[n];
}
// 优化的动态规划
public static int getMaxIntegerSplitMultiply2(int n) {
if (n < 4) {
return n - 1;
}
int[] dp = new int[n+1];
dp[0] = dp[1] = 0;
dp[2] = 1;
for (int i=3;i<=n;i++) {
dp[i] = Math.max(Math.max(2*(i-2), 2*dp[i-2]), Math.max(3*(i-3), 3*dp[i-3]));
}
return dp[n];
}
// 数学方法
public static int getMaxIntegerSplitMultiply3(int n) {
if (n < 4) {
return n - 1;
}
int quotient = n / 3;
int remainder = n % 3;
if (remainder == 0) {
return (int)Math.pow(3, quotient);
} else if (remainder == 1) {
return (int)Math.pow(3, quotient-1) * 4;
} else {
return (int)Math.pow(3, quotient) * 2;
}
}
}