题解使用了自顶向下的动态规划方法,并利用记忆化来存储已经计算过的结果,避免重复计算,提高效率。函数dp(i)的作用是找到长度为i的竹子能得到的最大乘积。基本情况是当i等于2时,最大乘积为1。对于i大于2的情况,我们通过尝试每一种可能的第一段长度j(从2到i-1),计算两种情况的最大值:一是将竹子剩余部分继续切割得到的最大乘积(j * dp(i - j)),二是直接将竹子切成j和i-j两段(j * (i - j))。这两种情况的最大值,即为当前i的最大乘积。这样的递归确保我们可以从已解决的子问题构建出更大问题的解答。
时间复杂度: O(n^2)
空间复杂度: O(n)
class Solution:
def cuttingRope(self, n: int) -> int:
memo = dict() # 初始化字典用于记忆化存储
def dp(i):
if i == 2:
return 1 # 当长度为2时,只有一种切割方法,乘积为1
if i in memo:
return memo[i] # 如果结果已经计算过,直接返回结果,避免重复计算
res = 0 # 初始化最大乘积为0
for j in range(2, i): # 遍历所有可能的第一段长度
res = max(res, max(j * dp(i - j), j * (i - j))) # 计算不继续切和继续切的最大乘积
memo[i] = res # 存储计算结果
return memo[i] # 返回当前长度的最大乘积
return dp(n) % 1000000007 # 返回结果并取模