實現給一段長度為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不是乙個給定的引數。思路是,...