劍指offer67 剪繩子

2021-10-20 19:26:56 字數 922 閱讀 4942

給你一根長度為n的繩子,請把繩子剪成整數長的m段(m、n都是整數,n>1並且m>1,m<=n),每段繩子的長度記為k[1],…,k[m]。請問k[1]x…xk[m]可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

第一次做這個題的時候其實走入了歧途,跟著某個大佬利用數學直接整明如何剪,現在想想我們刷題就是為了遇見某個問題能有通用的解決方法解決了問題,再去尋求更高效的方法。

本題其實很明顯的跟跳台階有很大的相似之處,因此也可以嘗試用遞迴或者動態規劃來做。

首先是遞迴。遞迴就要找到遞迴的返回條件。

長度為2的繩子,只有一種剪的方法,即1+1(因為不能不剪),乘積為1

長度為3的繩子,也只有一種剪法,即1+2(和2+1是一樣的),乘積為2

長度為4的繩子,就有2種了,即1+3和2+2,大乘積為4

長度為5的繩子,也有2種,即1+4和2+3,大乘積為6

上面要注意的是,2和3是非常特殊的,作為總長度的時候,分開後的乘積是比本身長度小的,但是不得不分開;但是作為小段長度,我們可以選擇不分開,取本身。所以我們就將遞迴返回邊界定為n<=3,滿足直接返回本身

實現:

class

solution

intcutrope

(int number)

};

最大的n輸入為30,通不過題目給的62。原因在於遞迴過程中在不斷計算cut(n-i),如果能想辦法將先計算過的儲存起來,就能減少後續計算的時間了,即動態規劃的思路。

動態規劃:

class

solution

}return v[number];}

};

劍指offer 67 剪繩子

給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1,m n 每段繩子的長度記為k 1 k m 請問k 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。2 n 60 class solu...

劍指offer67 剪繩子

給你一根長度為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。輸入乙個數n,意義見題面...

劍指offer 67剪繩子(Python)

題目 給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1,m n 每段繩子的長度記為k 1 k m 請問k 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。思路 第一種方法是暴力遞迴法...