题目:给你一根长度为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.
代码(一):
#
-*- coding:utf-8 -*-
class Solution:
def maxProductAfterCutting(self, n):
# write code here
if n < 2 :
return 0
elif n == 2:
return 1
# elif n == 3:
# return 2
max_list = [0,1,2]
for i in range(3,n+1):
if i < n :
max = i
else:
max = 0
for j in range(1,i//2+1):
tmp = max_list[j]*max_list[i-j]
if tmp > max:
max = tmp
max_list.append(max)
return max_list[n]
print(Solution.maxProductAfterCutting(Solution,5))
代码思路:动态回归。
构思是从上往下分析问题,从下往上解决问题。
F(5) 可以分解成 F(1)和F(4); F(2)和F(3);
然后F(4)可以分解成F(1)和F(3);F(2)和F(2);
F(3)又可以分解成F(1)和F(2);F(1)和F(1)和F(1);
就是把一个问题分解为若干个子问题,每个子问题又存在自己的最优解,结合起来会得到宗问题的最优解。