給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。
示例 1:
輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1。
示例 2:
輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。
說明: 你可以假設 n 不小於 2 且不大於 58。
求最值問題最先想到的就是動態規劃問題。動態規劃的核心問題就是窮舉。因為要求最值,肯定要把所有可行的答案窮舉出來,然後求最值。但是動態規劃有點特別,因為這類問題存在[重疊子問題],如果暴力窮舉的話,效率會及其底下,所以需要[備忘錄]或者[dp table]
來優化窮舉過程,避免不必要的計算。
我們可以用dp[i]
來表示i
這個值能被分解得到的最大的值。
如何進行轉移呢?對於整數j,我們可以將其分為i
和j-i
兩個部分,則(j-i)
與dp[j-i]
的較大值與i進行相乘即為所需要的結果。則狀態轉移方程如下:
dp[n] = i * max(n-i,dp[n-i])
;
時間複雜度是 o(n^2),n
輸入大小。
class solution
}return dp[n];
}}
343 整數拆分
題目鏈結 首先根據題目很容易的到的乙個點是 要使乘積最大能選擇的 數字只能是1 2 3 之後選擇的任何乙個數都可以拆分成這三個的乘積所以只要選這三個就可以。證明方法就是 假設輸入的數為x在x 4 的時候 2 x 2 x恆成立因此在選擇 乘積大於4的時候總是能選擇乙個 x 和 x 2 拆分這個資料 如...
343 整數拆分
給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。返回你可以獲得的最大乘積。令dp i 表示正整數i拆分時獲得的最大乘積,那麼i可以拆分為j和i j,如果i j不在拆分,乘積就是j i j 如果繼續拆分,乘積就是j dp i j 遍歷j取最大值即可。邊界條件,dp 0 dp...
343 整數拆分
題目描述 給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。返回你可以獲得的最大乘積。示例 1 輸入 2 輸出 1 解釋 2 1 1,1 1 1。示例 2 輸入 10 輸出 36 解釋 10 3 3 4,3 3 4 36。說明 你可以假設 n 不小於 2 且不大於 58。方...