劍指offer面試題 14剪繩子 Java版

2021-09-05 18:07:50 字數 1077 閱讀 2985

給你一根長度為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)表示吧長度為n的繩子剪成若干段後各段長度乘積的最大值。在剪第一刀的時候,我們有n-1種可能的選擇,也就是剪出來的第一段的繩子可能長度為1,2,3,…,n-1,因此f(n)=max(f(i)*f(n-i)),其中0這是乙個從上到下的遞迴公式。由於遞迴會有很多重複的子問題,從而會有大量不必要的重複運算。為了避免上述問題,我們不採用遞迴,從下而上來順序計算,即先計算f(1)接著計算f(2)…直到得到f(n)。

當繩子長度為2時,只能剪成兩段長度都為1的,因此f(2)=11=1,當繩子長度為3的時候可以剪成長度分別為1、2的兩段或者長度都為1的三段,因為111=1<12=2因此f(3)=2

**實現

public

static

intmaxproductaftercutting_solution1

(int length)

if(length==2)

if(length==3)

//products陣列第i個元素代表著長度為i的繩子剪成若干段之後各段長度乘積的最大值

//i>=4時上述概念有效

int[

] products=

newint

[length+1]

;//下面的初始化不代表著最大值,是為了方便i>=4的計算

products[0]

=0; products[1]

=1; products[2]

=2; products[3]

=3;int max=0;

for(

int i=

4;i<=length;i++)}

products[i]

=max;

} max=products[length]

;return max;

}

劍指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 表示...