題目描述
給你一根長度爲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。
輸入輸出
輸入8,輸出則爲18
思路1:動態規劃思想。什麼樣的題可以用動態規劃思想求解:1.題目是最優化問題 2.最優化問題可以分解成很多小的最優化子問題 3.分解的子問題有重疊部分。把一條長爲n的繩子剪成2段,使得長度的乘積最大,從長度爲i的地方剪,那麼得到的乘積是i*(n-i)。但不知道從哪裏開始,那麼就試唄,從i=1,i=2,i=3,...,i=n-1的地方剪,長度最大的乘積是max(i*(n-i))。但是現在不是讓剪兩段,現在是要剪成m段,這m段長度的乘積是最大的。...........
python題解:
# -*- coding:utf-8 -*-
class Solution:
def cutRope(self, number):
# write code here
if number<2:
return 0
if number==2:
return 1
if number==3:
return 2
f=[0]*(number+1) ##f={}也可以
f[0]=0
f[1]=1
f[2]=2
f[3]=3
for num in range(4,number+1):
tmp_max=0
for i in range(1,number/2+1):
if f[i]*f[num-i]>tmp_max:
tmp_max=f[i]*f[num-i]
f[num]=tmp_max
final_max=f[number]
return final_max
這道題也可以變形呀,可以問乘積最大時,繩子被剪成了幾段?