題目
給你一根長度為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.
解題思想
動態規划(具體解法及思路見代碼注釋)
解題代碼(python實現)
# 題目一:給你一根長度為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. #解題思路:動態規划 def rope_cut(length): # 最優解數組,當長度為0是為0,當長度為1是為1,當長度為2時為2,當長度大於3時,3就不能切開了,因為3>1*2,最優解數組為3 li=[0,1,2,3] if length==0:#當長度為0時,返回0 return 0 if length==1:#當長度為1時,返回1 return 1 if length==2:#當長度為2時,返回2 return 2 if length==3:#當長度為3時,返回2,雖然最優解數組里為2,但是每次必須得切一刀,這樣1*2=2,所以長度為3時還是2 return 2 for j in range(4,length+1): max = 0 for i in range(1,j): # 思路:每次求解值時將其他小於需要求解的長度是都列出來放在一個數組里 #如:求長度為5,最優解數組里必須得有長度為1,2,3,4的最優解值 #注:此處使用列表保存最優解數組是為了性能優化,雖然遞歸求解也能解出,但會造成大量重復執行 temp=li[i]*li[j-i] if temp>max: max=temp li.append(max)#每次將上次所得最優解追加在列表里 return li[-1] print(rope_cut(8))
(ps:只想說,解出一道題的感覺真的好爽)