劍指offer 67剪繩子(Python)

2021-10-07 14:58:18 字數 1685 閱讀 2381

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

【思路】第一種方法是暴力遞迴法,不斷的去判斷前一次所有的剪法中乘積最大的剪法,python的遞迴深度有限制。不建議採取此方法,太多的重複計算。

【**】

class

solution

:def

fun(self,num)

: ret =

0if num <4:

return num

for i in

range

(num)

: ret =

max(ret,i * self.fun(num - i)

)return ret

defcutrope

(self, number)

:if number <2:

return

0elif number ==2:

return

1elif number ==3:

return

2else

:return self.fun(number)

第二種方法,動態規劃法,根據公式f(n) = max(f(i)*f(n-i)),將乙個大的問題拆成若干個已經解決的小問題,建立乙個陣列(我這裡用的是字典。。。)存放之前處理好的結果,用的時候直接去陣列裡讀取結果即可。

class

solution

:def

cutrope

(self, number)

:if number <2:

return

0elif number ==2:

return

1elif number ==3:

return

2 dp =

dp[1]

=1dp[2]

=2dp[3]

=3res =

0for i in

range(4

,number+1)

:for j in

range(1

,i/2+1

):res =

max(res,dp[j]

*dp[i-j]

) dp[i]

= res

return dp[number]

第三種方法,貪心演算法,根據數學推導,在number大於4時,將其劃分為若干3和剩下的相乘得到的積最大,等於4時分為2×2乘積最大,在下列**中直接乘以4了。

class

solution

:def

cutrope

(self, number)

:max=1

if number <

3and number >0:

return number -

1while number >4:

number -=

3max

=max*3

return number *

max

劍指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,m n 每段繩子的長度記為k 1 k m 請問k 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。第一次做這個題的時候其實走入了歧途...

劍指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,意義見題面...