题目:
题目:给你一根长度为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.
第一种解法,
时间复杂度为O(n2);
空间复杂度O(n)
# 一根长度为n的木棍,切为m段, 使得各段的长度的乘积最大,返回最大的乘积结果。
# 剑指offer第二版96页
def rope_cut(length):
if length<2:
return 0
if length==2:
return 1
if length==3:
return 2
if length == 4:
return 4
li=[0,1,2,3]
max0=0
for i in range(4,length+1):
for j in range(1,i):
temp=li[j]*li[i-j]
if temp>max0:
max0=temp
li.append(max0)
return li[-1]
n=int(input())
print(rope_cut(n))
第二种解法:
时间复杂度和空间复杂度均为O(1):
def rope_cut(length):
if length < 2:
return 0
if length==2:
return 1
if length==3:
return 2
t3=int(length/3)
if(length-t3*3==1):
t3-=1
t2=(length-t3*3)/2
return int(pow(3,t3)*pow(2,t2))
n=int(input())
print(rope_cut(n))