给定长度为n的绳子,剪成m段,具体m为多少就是算法要考虑的,反正m>1,即至少要剪成2段;使剪成的每一段的长度乘积最大
思考:
对于n<=3,至少要剪成2段,则长度必然缩小;即长度为2,1+1=2,11=1;长度为3,1+2=3,12=3;但对于长度4就不一定,1+3,2+2都行;
使用字典,记忆化搜索
class Solution(object):
def cuttingRope(self,n):
if n<=3:
return n-1
memo = {}
def cut(n):
if n not in memo:
if n<=3:
memo[n]=n#递归出口
else:
mx = 0 #递归内部
for i in range(2,n): #i的取值范围为【2~n-1】,因为如果切的一段为1的话,其乘积一定比原理的值更小
mx = max(mx , i*cut(n-i))
memo[n]=mx
return memo[n]
return cut(n)
动态规划的题,精辟
递归出口:
n<=3,直接返回n本身即可,注意这里和上面的n<=3并不同,这里不需要再次拆分,因为是由更大的数字>=4拆分而来的,所以自身就是最大值