題目要求:
給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]…k[m] 。請問 k[0]k[1]…*k[m] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
解題思路:
動態規劃條件:
1.大問題分解小問題,小問題也存在最優解
2.小問題之間有相互重疊的更小子問題,所以要陣列儲存每次小問題計算的結果
3.從上往下分析問題,但是從下往上計算,把子問題的最優解組合起來解決大問題
解題步驟:
所以使用動態規劃,因為設f(n)為當繩子長度為n時的最優解乘積,當剪第一刀時候,剪在長度為i的位置,共n-1種選擇。所以得到自上而下的遞迴公式
f(n)=max(f(i)*f(n-i)) 0class
solution
//題目規定了m>1,所以長度0或1的繩子無法剪
if(n==1)
if(n==2)
if(n==3)
int products=
newint
[n+1];
products[0]
=0;products[1]
=1;products[2]
=2;products[3]
=3;//因為當長度為3的繩子不剪,比任何剪法都要長
for(
int i=
4;i<=n;i++)}
products[i]
=max;
}return products[n];}
}當題目要求n可能很長,則考慮使用大整數biginteger
貪婪演算法解題思路
當然這題還可以使用貪婪演算法,根據數學公式推導得知,當n>=5時,每次剪掉長度為3(當最後剩下長度為4時,剪成兩段22的,因為22>3*1)。
class
solution
//題目規定了m>1,所以長度0或1的繩子無法剪
if(n==1)
if(n==2)
if(n==3)
int timesof3=n/3;
if((n-timesof3*3==
1))int timesof2=
(n-timesof3*3)
/2;return
(int
)math.
pow(
3,timesof3)*(
int)math.
pow(
2,timesof2);}
}
劍指offer 面試題14 剪繩子
給你一段長度為n的繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。第一種是動態規劃 自下而上 public...
《劍指Offer》面試題14 剪繩子
要求 剪繩子 給你一根長度為n的繩子,請把繩子剪成m段 m n都是整數,n 1,並且m 1 每段繩子的長度記為k 0 k 1 k m 請問看k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2,3,3,的三段,此時得到的最大乘積是18。測試用例 功能測試 ...
面試題14 劍指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的三段,此時得到的最大乘積是18.思路 利用動態規劃法,f n 表示...