數學動態規劃之整數拆分

2021-10-09 08:16:31 字數 1513 閱讀 1135

給定乙個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。

示例 1:

輸入: 2

輸出: 1

解釋: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

輸入: 10

輸出: 36

解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

數學法:

盡可能多的拆成3

如果能整除3:乘積為3^(n//3)

如果除3的餘數為1:拆成(n//3-1)個3和兩個2,因為13 < 22

如果除3的餘數為2:拆成(n//3)個3和乙個2

class

solution

:def

integerbreak

(self, n:

int)

->

int:

if n <=3:

return n -

1 a = n //

3 b = n %

3if b ==0:

return

3** a

if b ==1:

return3**

(a-1)*

4if b ==2:

return

3** a *

2

動態規劃

dp[i]表示整數i對應的最大乘積,那麼dp[i]的值應是dp[j]*(i-j),j屬於[1,i]的最大值,同時注意dp[i]對應的值是經過拆分了的,所以還應判斷兩個數拆分的情況,即j*(i-j)的值,取最大即可。

也即乙個數可以拆成兩個數,或者拆完之後繼續拆分

class

solution

:def

integerbreak

(self, n:

int)

->

int:

if n <=3:

return n -

1 dp =[0

]*(n+1

) dp[1]

=1for i in

range(2

, n+1)

:for j in

range(1

, i)

: dp[i]

=max

(dp[i]

, dp[j]

*(i-j)

) dp[i]

=max

(dp[i]

, j *

(i-j)

)return dp[n]

動態規劃 整數拆分

時間限制 1秒 空間限制 65536k 熱度指數 8566 乙個整數總可以拆分為2的冪的和,例如 7 1 2 4 7 1 2 2 2 7 1 1 1 4 7 1 1 1 2 2 7 1 1 1 1 1 2 7 1 1 1 1 1 1 1 總共有六種不同的拆分方式。再比如 4可以拆分成 4 4,4 1...

動態規劃 整數拆分(純DP)

name 整數拆分 兩種做法 dp actor ht time 2015年9月28日 error reporte 1.初始化邊界處理 沒弄清 include include include include include include using namespace std define n 12...

動態規劃求解整數拆分問題

include define maxn 10 採用動態規劃求解整數拆分問題。設f n,k 為n的k拆分的拆分方案個數 其中,n表示被劃分的數,k表示被劃分出來的數中的可能出現的最大值,f n,k 的值表示劃分的方法個數 1 當n 1或者k 1時,顯然f n,k 1。2 當n 3 當n k時,其拆分方...