1. 题目
2. 思路
(1) 数学法
- 根据数学规律,将整数尽量拆分成3时的乘积最大,拆分的结果有三种:
- 余数为1:将最后一个3与1合并成4,然后连乘。
- 余数为2:正常连乘;
- 余数为0:正常连乘。
(2) 动态规划
- 对于整数i,可以拆分成j和i-j,其局部最大乘积=max(j*(i-j),j*dp[i-j]),因此,从1遍历到i-1,即可得到整数i的全局最大乘积dp[i]。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public int integerBreak(int n) {
if (n <= 3) {
return n - 1;
}
int a = n / 3;
int b = n % 3;
if (b == 1) {
return (int) Math.pow(3, a - 1) * 4;
} else if (b == 2) {
return (int) Math.pow(3, a) * 2;
} else {
return (int) Math.pow(3, a);
}
}
}
class Solution1 {
public int integerBreak(int n) {
if (n <= 3) {
return n - 1;
}
int[] dp = new int[n + 1];
dp[2] = 1;
dp[3] = 2;
for (int i = 4; i <= n; i++) {
int max = Integer.MIN_VALUE;
for (int j = 1; j < i; j++) {
max = Math.max(max, Math.max(j * (i - j), j * dp[i - j]));
}
dp[i] = max;
}
return dp[n];
}
}