LeetCode-剑指 Offer 14- I. 剪绳子
生活随笔
收集整理的這篇文章主要介紹了
LeetCode-剑指 Offer 14- I. 剪绳子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路一:動態規劃
1:首先我們想要求長度為n的繩子剪掉后的最大乘積,可以從前面比n小的繩子轉移而來
2:用一個dp數組記錄從0到n長度的繩子剪掉后的最大乘積,也就是dp[i]表時長度為i的繩子剪成m段后的最大乘積,初始化dp[2]=1
3:我們把繩子剪掉第一段(長度為j),如果只減去1,對最后的乘積沒有任何增益,所以長度為2開始剪
4:剪了第一段后,剩下(i-j)長度可以不剪。如果不剪對應j*(i-j);如果剪去對應j*dp[i-j]。取兩者最大值max(j*(i-1),j * dp[i-j])
5:第一段長度j可以取的區間為[2),對所有j不同的情況取最大值,因此最終dp[i]的轉移方程為dp[i] = max(dp[i],j*max(dp[i-j],(i-j)))
class Solution { public:int cuttingRope(int n) {if(n<2) return 0;vector<int> dp(n+1);//當繩子長度為i時候可能的最大乘積為dp[i]//確定初始化條件dp[2]=1; //0跟1減沒有意義for(int i=3;i<=n;i++){for(int j=2;j<i;j++){ //j表示剪下來的繩子大小,當剪下1時候沒意義,所以從2開始//繩子有兩種方式,一種是剪下之后,剩下的再剪下最大為j*dp[i-j]//一種是剪下之后,剩下的不減了,剩的為j*(i-j);dp[i] = max(dp[i],j*max(dp[i-j],(i-j))); //里面一直跟之前的遍歷減過的結果比較 }}return dp[n];} };總結
以上是生活随笔為你收集整理的LeetCode-剑指 Offer 14- I. 剪绳子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode-剑指 Offer 15
- 下一篇: LeetCode-剑指 Offer 18