難度:中等
給定乙個正整數 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月,而且題幹描述也有明顯的動態規劃特徵。
將乙個正整數n拆分成至少兩個正整數的和,這裡的至少我們可以這樣理解:先把n拆分成兩個整數,如果乘積不是最大的,那我們就再拆分其中的乙個整數,直到嘗試了所有的拆分可能,保留乘積的最大值。
根據這個思路我們可以寫出動態轉移方程:
由於題目中並沒有限制整數分解為幾個,所以我們只需要維護乙個一維陣列dp[i]表示i分解為至少兩個整數所得的乘積的最大值。
則有:dp[i]= max(j*(i - j),dp[i - j]* j)其中j從1到i-1變化
邊界條件是:dp[0]= dp[1]= 0
最後返回dp[n]
題解:
int
integerbreak
(int n)
}return dp[n]
;}
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
每日一題 整數劃分
title 每日一題 整數劃分 date 2019 10 27 17 15 16 tags 91.整數劃分 15分 c時間限制 2 毫秒 c記憶體限制 65535 kb 題目內容 對於乙個正整數n的劃分,就是把n變成一系列正整數之和的表示式。注意,分劃與順序無關,例如6 5 1跟6 1 5是同一種分...
每日一題 Leetcode 7 整數翻轉
給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 注意 假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 231,231 1 請根據這個假設,如果反轉...