343. 整數拆分
阿新 • • 發佈:2020-07-27
給定一個正整數n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
示例 1:
輸入: 2 輸出: 1 解釋: 2 = 1 + 1, 1 × 1 = 1。
示例2:
輸入: 10 輸出: 36 解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
說明: 你可以假設n不小於 2 且不大於 58。
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/integer-break
思路:
列出來前面的一些,找規律,看後面的是怎麼來的
1 - 0 2 - 1 3 - 2 4 - 4 5 - 6 6 - 9 7 - 12 8 - 18 9 - 27 10 - 36
到7之前的都是分解成兩位3* 4 3 * 3 2 * 3之類的,到8開始發生了變化是 2 * (6對應的值)
所以要麼比較j * (i - j ),要麼比較 j * dp[ i - j]
class Solution { //遞迴-自頂向下 public int integerBreak(int n) { int[] dp = new int[n + 1]; dp[2] = 1; for(int i = 2;i <= n;i++){ for(int j = 1;j <= i - 1;j++){ inta = j * dp[i - j]; int b = j * (i - j); dp[i] = Math.max(dp[i], Math.max(a,b)); } } return dp[n]; } }