給你一根長度為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。思路:動態規劃
定義函式f(n)為把長度為n的繩子剪成若干段後各段長度乘積的最大值。
首先,當繩子長度小於等於3時,可以發現其剪後的乘積都比原來的長度小。故可以把小於等於3的長度看做特殊情況先列出來。f(1) = 0、f(2) = 1、f(3) = 2。
因此,當繩子長度大於3時,當繩子長度剪到部分小於等於3時則不應該再剪。
確定子問題:例如繩子的長度為8,那麼可以剪成1,7兩段,那麼此時又要求解長度為7的繩子怎麼剪最好。依次類推。
確定轉移方程,可得 f(i) = max(f(j) × f(i − j)), 0 < j < i
注意邊界條件:雖然有f(0)=f(1)=0;f(2)=1;f(3)=2; 但是在表中存下來卻不是這個值,而應該是:f(1) = 1、f(2) = 2、f(3) = 3。即在起始條件的時候小問題的最優解並不是我們求解大問題時使用的那個值。
c++
class
solution
;//0為佔位,無用
for(
int i =
4; i <= number; i++
) backup.
push_back
(max);}
return backup[number];}
};
python
# -*- coding:utf-8 -*-
class
solution
:def
cutrope
(self, number)
:# write code here
if number <=1:
return
0if number ==2:
return
1if number ==3:
return
2 backup =[0
,1,2
,3]for i in
range(4
, number +1)
: max =
0for j in
range(1
, i /2+
1): temp = backup[j]
* backup[i - j]
if max < temp:
max = temp
return backup[number]
劍指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的三段,此時得到的...
劍指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。思路 動態規劃 任何動態規劃都是由遞迴演...
《劍指Offer》剪繩子
給你一根長度為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 乘法計算,除了一以外,越多的數相...