劍指offer面試題14 剪繩子

2021-10-05 06:01:11 字數 1378 閱讀 2158

題目要求:

給你一根長度為 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 表示...