【題目】給你一根長度為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,意義見題面...