解题思路
设一维数组dp,其值含义表示 正整数i拆分为至少两个正整数,其乘积最大的积。
其中 2 <= i <= n,假设拆分成两份,1 <= j < i,拆分成 j 和i - j 两部分
- i-j 不继续拆分,所以最大的积是j * (i - j)
- i-j 继续拆分,所以最大的积是j * dp[i - j]
所以递推公式就是 dp[i] = max(j * (i - j), j * dp[i - j])
代码如下
class Solution {
public int integerBreak(int n) {
int[] dp = new int[n + 1];
for (int i = 2; i <= n; i++) {
int curMax = 0;
for (int j = 1; j < i; j++) {
curMax = Math.max(curMax, Math.max(j * (i - j), j * dp[i - j]));
}
dp[i] = curMax;
}
return dp[n];
}
}