#-*- coding:utf-8 -*-
'''
description:
name:剪绳子
内容:给你一根长度为n的绳子,请把绳子剪成m段(n>1,m>1),每段绳子的长度即为k[0],k[1]....k[m],请问k[0]*k[1]*..*k[m]可能的最大乘积是多少
'''
class Solution:
def dynamic_programming(self, n):
if n < 2:
return 0
if n == 2:
return 1
if n == 3:
return 2
tmp_lst = [0, 1, 2, 3]
for i in range(4, n+1):
max = 0
for j in range(1, i//2+1):
tmp = tmp_lst[j] * tmp_lst[i-j]
if max < tmp:
max = tmp
tmp_lst.append(max)
return tmp_lst[n]
'''
我发可以发现当n<=3时如果再剪一刀那么结果肯定小于未剪时的值,而当n>3时继续剪肯定会存在大于等于未剪时的数
即我们将长为n的数一直剪下去知道碰到剩下的小于4时结束
'''
def greedy_algorithm(self, n):
if n < 2:
return 0
if n == 2:
return 1
if n == 3:
return 2
multi_3 = 0
while n > 4:
multi_3 += 1
n -= 3
return 3**multi_3*n
s = Solution()
print(s.dynamic_programming(8))
print(s.greedy_algorithm(4))