內容:
給定一根長度為n的繩子,請把繩子剪成m段,每段繩子記為k[0],k[1]……k[m]。請問k[0]*k[1]……*k[m]可能的最大乘積是多少?例如:當繩子長度為8時,我們把它剪成長度分別為2,3,3段,此時最大乘積為18.
解題思路:
思路一:我們先考慮能否把大問題分解成小問題,分解後的小問題也存在最優解,如果把小問題的最優解組合起來能否是整個問題的最優解,這就是動態規劃求解。我們把繩子從第i(i**實現:
int maxlength(int a,int length)
i++;
} return a[length];
}main()函式中傳入的陣列的初始化值應該是,並且長度大於繩子的長度
思路二:
從問題的某乙個初始解出發逐步逼近給定的目標,以盡可能快的地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止,這就是貪婪演算法。在剪繩子中,如果繩子的長度大於5,則每次剪出的長度為3的繩子。如果剩下的長度仍然大於5,則接著剪出一段長度為3的繩子,重複這個步驟,直到剩下的長度小於5.時間和空間複雜度都為o(1)。
**實現:
int maxlength(int length)
劍指offer 剪繩子問題
給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 xk 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。用貪心和動態規劃兩種方法...
劍指offer 剪繩子問題
給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1,m n 每段繩子的長度記為k 1 k m 請問k 1 x.xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。輸入乙個數n,意義見題面。2 n ...
劍指Offer 剪繩子 和剪繩子
劍指offer 剪繩子 題目描述 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的...