給你一根長度為 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。
首先是貪婪演算法:貪婪演算法可以是找到乙個數學情景,可以證明在這種場景下,達到最優解。在剪繩子的過程中,盡量剪長度為3的繩子,如果剩下的繩子是4,可以不用剪。由於5< 23,可以看出,當n>=5, 3(n-3)> n ,
2*(n-2)>n,並且3*(n-3)> 2*(n-2) 可以看出,n>5的時候,盡量剪成2和3的,並且,剪成3的長度優於2。4 =2 *2所以,剪成4和2一樣。
class
solution
(object):
defcuttingrope
(self, n)
: a =
0if n ==2:
return
1if n ==3:
return
2if n ==4:
return
4while n >=5:
n = n -
3 a +=
1if n ==1:
return
pow(
3, a)
if n ==2:
return2*
pow(
3, a)
if n ==3:
return3*
pow(
3, a)
if n ==4:
return4*
pow(
3, a)
2.動態規劃
採用自底向上的思想,相當於一根繩子肯定會剪成兩根,然後剩下的兩根繩子再依次去剪。如果從1開始依次計算出每種長度的繩子的最優解,那麼,新的繩子的長度的計算就可以依賴於之前的繩子,只需要拆成兩種長度的相乘即可,因為之前的繩子已經是最優解了。
注意是一定要剪一刀,所以1,2,3,4情況特殊,列出來,與後面如果剪到1,2,3,4的時候不一樣,剪下去不是最優解。
class
solution
(object):
defcuttingrope
(self, n)
:if n ==1:
return
false
if n ==2:
return
1if n ==3:
return
2if n ==4:
return
4 a =
0)1)
2)3)
4)for i in
range(5
, n+1)
:max=0
for j in
range(1
, i//2+
1):if a[j]
*a[i-j]
>
max:
max= a[j]
*a[i-j]
max)
return a[n]
剪繩子 演算法 C 學習之路之剪繩子問題
基於c 實現剪繩子問題,既將一根長度為n的繩子,剪成m段,使m段的乘積最大。如,長度為10的繩子,最大乘積為36。使用動態規劃和貪心演算法實現,具體 如下 include stdio.h include stdlib.h include using namespace std 動態規劃問題 剪繩子問...
劍指Offer 剪繩子 和剪繩子
劍指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的三段,此時得到的...
剪繩子 演算法 424,劍指 Offer 剪繩子
給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。示例 1 ...