標籤:nbsp 使用 python實現 gpo 重複執行 class 解法 end 長度
題目
給你一根長度為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:只想說,解出一道題的感覺真的好爽)
(python)劍指Offer(第二版)面試題14:剪繩子