題目來源 343. 整數拆分 題目詳情 給定一個正整數 n ,將其拆分為 k 個 正整數 的和( k >= 2 ),並使這些整數的乘積最大化。 返回 你可以獲得的最大乘積 。 示例 1: 輸入: n = 2 輸出: 1 解釋: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 輸入: n = ...
題目來源
題目詳情
給定一個正整數 n
,將其拆分為 k
個 正整數 的和( k >= 2
),並使這些整數的乘積最大化。
返回 你可以獲得的最大乘積 。
示例 1:
輸入: n = 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
輸入: n = 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
提示:
2 <= n <= 58
題解分析
本題整數拆分的核心問題是如何定義狀態方程的轉移。狀態方程的定義是比較簡單的,dp[i]就表示i拆分後可以得到的最大乘積。對於dp[i]的狀態轉移來說,需要考慮以下兩種情況:
- i可以拆分為j和i-j,i-j無需再次拆分,此時的乘積為:j * (i - j)
- i可以拆分為j和i-j,將i-j再次拆分,此時的乘積為:j * dp[i - j]
為了求得最大乘積,需要從1開始遍歷上述的j,在遍歷的過程中不斷更新dp[i]為最大值。
結果只需要返回dp[n]即可,也就是將n進行拆分後的最優結果。
java實現
class Solution {
public int integerBreak(int n) {
// dp[i] = max(j * (i - j), j * dp[i-j])
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 0;// 不可再分
for (int i=2; i<=n; i++) {
dp[i] = 0;
for (int j = 1; j<i; j++) {
dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i-j]));
}
}
return dp[n];
}
}