題目鏈結
首先根據題目很容易的到的乙個點是 要使乘積最大能選擇的 數字只能是1 2 3 ,之後選擇的任何乙個數都可以拆分成這三個的乘積所以只要選這三個就可以。
證明方法就是 :
假設輸入的數為x在x>4 的時候 2(x-2)>x恆成立因此在選擇 乘積大於4的時候總是能選擇乙個 x 和 x-2 拆分這個資料
如果選擇 整數4 也可以用 2 *2 代替 4 (相當於是拆分了)
所以我們如果選擇乙個乘數肯定不會大於4 也就是只能選擇1 2 3
如果小於4則最大乘積就是本身
這樣的話實際上就可以解決這個問題了
class solution
return ans * n;}};
還可以在進一步
如果n >=5的時候是不會選擇數字1 的
證明如下:
如果選擇 1
n - 1 >=4
這樣就回到之前證明的這裡總能拆分成兩個數的乘積 在這兩個數中任意乙個數 +1 都會大於 選一情況,所以在n>=5的時候不需要選擇1
同樣的在n>=5的時候不會出現 3 個2 (以上) 因為 3*3 >2 * 2 *2
在這裡n =4 同樣可以考慮進去
using namespace std;
class solution
int quotient = n / 3;
int remainder = n % 3;
if (remainder == 0) else if (remainder == 1) else }};
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。求最值問題最...
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。方...