defmemoized_cut_rod_aux(p, n, r):'''
携带一张收益表, 减少重复计算
'''if r[n-1]>=0:
return [r[n-1], r]
if n==0:
return [0, r]
else:
q = 0for i in range(1, n+1):
sub_res = memoized_cut_rod_aux(p, n-i, r)
sq = sub_res[0]
r = sub_res[1]
q = max(q, p[i-1]+sq)
r[n-1] = q
return [q, r]
进行时间对比
n = 25
p = getp(n)
r = [-1for i in range(n)]
s = time.time()
q, r= memoized_cut_rod_aux(p, n, r)
e = time.time()
d = (e-s)
s1 = time.time()
q_normal = nr.cut_rod(p, n)
e1 = time.time()
d1 = (e1-s1)
#print(r)print("normal method: %s%s"%(q_normal, d))
print("memoized method: %s%s"%(q, d1))
#结果
normal method:4000.0009999275207519531
memoized method:40017.095400094985962