阿亮的演算法之路 343整數拆分

2021-10-08 12:33:07 字數 1476 閱讀 8364

動態規劃集中練習

看到這個題目,會想到用動態規劃來做,但是我在想,可不可以用一種統一的思想來解決這個問題呢?類似的,比如給定乙個周長,求圍成面積最大的圖形,那一定是園,將各個方向都崩得最大。

我覺得這個題和求面積最大的圖形那個題很類似,那這個題的思路肯定也是,將拆分的個數和每乙個數的大小都要最大。經過多次嘗試,都不行,因為,要拆分成整數,就無法很好的同時兼顧,比如10,按照我的思路,就是應該拆分成3、3、3、1,但是應該是拆成2、3、2、3才是最優的解。而且,應該因數的個數和因數的大小權重應該是不一樣的。

思路如果用動態規劃,這個題實際上有幾個彎需要轉。

首先就是,狀態轉移方程應該怎麼寫,

dp[i] = max(dp[m]*dp[i-m]) m=1,2,3……i-1。我想到的動態轉移方程也是這樣,比如說10 = 2、3、2、3,就是10 = 5、5,那dp[5]呢?5 = 2、3。但是,dp[2]和dp[3]呢,dp[2] = 1,dp[3] = 2。

所以,對於1,2,3,這個三個特殊的數字,不能把它們的結果放入dp中,而需要特殊判斷,特殊返回。如果想要後面的結果正確。那麼dp[2]就應該是2,而不是需要返回的1,同樣dp[3]應該是2。

另外,如果是完全平方數的整數倍,那麼一定是按照完全平方數來拆的。比如dp[8] = dp[4] * dp[4]。dp[27] = dp[9] *dp[9] *dp[9]

**

public

static

intintegerbreak

(int n)

dp[1]

=1; dp[2]

=2; dp[3]

=3;for

(int i =

3; i <= n; i++)}

return dp[n]

;}

主要就是1、2、3這三個特殊的數字,需要特殊處理。

提交結果

稍微的對完全平方數的整數倍那裡優化了一下

public

static

intintegerbreak

(int n)

dp[1]

=1; dp[2]

=2; dp[3]

=3;for

(int i =

3; i <= n; i++)}

return dp[n]

;}

提交結果

阿亮的演算法之路 6 Z 字形變換

看到題目就覺得有戲,看起來複雜了一點,但是憑我的感覺,這題用暴力是比較容易做的,只是可能比較繁瑣。z型變換,實際上是n型,不過都無所謂,我用乙個二維陣列往裡一套,後面再遍歷拼接成字串,就ok了。只是在往二維陣列裡放值的時候,條件不容易控制,需要慢慢找規律。思路因為需要慢慢找規律,所以我在草稿紙上畫了...

阿亮的演算法之路 213 打家劫舍 II

動態規劃集中練習 動態規劃的典型題目,是上乙個打家劫舍 題目的公升級版,不同的是,上乙個是乙個單鏈,這個是乙個環形。其實核心都是動態規劃,但是就算上乙個題會做,這個題也不一定會做,這裡還有一點需要考慮和處理。當然方法可能不止一種 如果以上來就考慮 環形的怎麼寫狀態轉移方程,那麼就很難跳出來。其實,我...

素數演算法的優化之路

一 素數的定義 質數又稱素數。指在乙個大於1的自然數中,除了1和此整數自身外,不能被其他自然數 不包括0 整除的數。因為合數是由若干個質數相乘而得來的,所以,沒有質數就沒有合數,由此可見質數在數論中有著很重要的地位。比如 2,3,5,7,9.都是素數。二 構造素數演算法 寫演算法之前,先來說說以下這...