def cut_rod_recursion_1(p, n):
"""最慢的递归 2 次: 大量重复计算"""
if n == 0:
return 0
else:
res = p[n]
for i in range(1, n):
res = max(res, cut_rod_recursion_1(p, i) + cut_rod_recursion_1(p, n - i))
return res
def cut_rod_recursion_2(p, n):
"""递归一次: top-down"""
if n == 0:
return 0
else:
res = 0
for i in range(1, n + 1):
res = max(res, p[i] + cut_rod_recursion_2(p, n - i))
return res
def cut_rod_dp(p, n):
"""动态规划: bottom-up"""
dp = [0]
# i:dp 对应的 index
# j:长度对应的 index
for i in range(1, n + 1):
res = 0
for j in range(1, i + 1):
res = max(res, p[j] + dp[i - j])
dp.append(res)
return dp[n]
def cut_rod_extend(p, n):
dp = [0]
s = [0]
for i in range(1, n + 1):
# 记录价格最大值、对应方案中 左边不切割的长度
res_r = 0
res_s = 0
for j in range(1, i + 1):
if p[j] + dp[i - j] > res_r:
res_r = p[j] + dp[i - j]
res_s = j
dp.append(res_r)
s.append(res_s)
return dp[n], s
def cut_rod_solution(p, n):
r, s = cut_rod_extend(p, n)
res = []
while n > 0:
res.append(s[n])
n -= s[n]
return f'最大利润: {r} 元,方案: {res}'