劍指Offer Java 14題 剪繩子

2021-09-21 13:37:59 字數 1036 閱讀 1759

實現給一段長度為n的繩子,把繩子剪成m段(m,n都是大於1的整數),求每段繩子長度的乘積的可能的最大值。

如長度為8的繩子,剪成三段2,3,3時乘積最大:18,最終輸出最大乘積18

動態規劃 t:o(n^2) m: o(n)

dp[i]:長度為i 的繩子能剪出的最大乘積

長度為i 再剪一刀,一段長度為j,則另一段長度為i-j

這兩段也可以依次得到每一段能剪出的最大乘積,

所以,dp[i]=max(dp[j]*dp[i-j])

邊界值:題目要求至少要剪一刀。所以

長度為0–>0

長度為1–>0

長度為2–>1

長度為3–>2

貪心演算法 t:o(1) m:o(1)

盡可能多地剪出長度為3的,

若剪到最後長度還剩4,就不能再剪3了,應該剪2,因為2 * 2>3 * 1

(這題貪心法更好,但是需要證明為什麼貪心法得到的就是最優解)

動態規劃

/*

* 給一段長度為n的繩子,把繩子剪成m段(m,n都是大於1的整數),求每段繩子長度的乘積的可能的最大值。

*///動態規劃:t:o(n^2) m: o(n)

public int maxproduct

(int length)

}return dp[length]

;}

貪心演算法
//貪心演算法  t: o(1)    m:o(1)    

//盡可能多的選取3

public int maxproduct1

(int length)

int timeof2=

(length-timeof3*3)

/2;//剪長度2的次數

return

(int)math.

pow(

3, timeof3)

*(int)math.

pow(

2, timeof2)

;返回double型,所以需要強轉!

}

劍指14 剪繩子

題目 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。分析...

劍指offer 14 剪繩子

分析 本題可以用動態規劃,也可以用貪心法。動態規劃 設f n 表示當繩子長n時可以得到的最大乘積,那麼假設在i處切一刀,就會得到數學式子f n max f i f n i 02等於4,但是當n大於等於5時,我們就要拆成盡可能多的3和剩下的2。如果要證明,我們可以證明當n大於5時,有3 n 3 2 n...

劍指offer 14 剪繩子

這種文章網上很多,沒什麼營養,我只是自己記錄一下。雖然現在不找工作了,但以後演算法能力肯定需要加強,想著能不能每天堅持一道題,其實真做起來還有點難 劍指offer以前都是邊看答案邊記下來,現在能不能靠自己寫出來呢。時間複雜度為o n2 空間複雜度為o n 有一點要注意,m不是乙個給定的引數。思路是,...