python中的memoization,由一个错误关闭

时间:2012-10-26 18:11:45

标签: python algorithm runtime-error

我目前正在参加算法课程。我在python中测试了很多,包括动态编程。这是自下而上的杆切割实施的实施方式。

由于出现了一个错误,它无法正常工作。在python中是否有全局设置,我可以将默认数组索引更改为1而不是0?或者有人可以请我提供一个更好的策略来克服一次一个错误,我遇到了一百万次。这太烦人了。

def bottom_up_memo_cut_rod(p,n):
    r = [ 0 for i in range(n) ]
    r[0] = 0
    for j in range(n):
        q = -1
        for i in range(j):
            q = max(q, p[i] + r[j-i])
        r[j] = q
    return r[n]

bottom_up_memo_cut_rod([1,5,8,9], 4)
在这种情况下,答案应该是10,将4切成(2,2),最高价格为10。

3 个答案:

答案 0 :(得分:2)

Python中有很多东西可以帮到你。内置的enumerate非常棒。

for idx, val_at_idx in enumerate(aList):
  # idx is the 0-indexed position, val_at_idx is the actual value.

如果绝对必要,您还可以使用带枚举的列表切片来移动索引:

for idxOffBy1, val_at_wrong_idx in enumerate(aList[1:]):
  # idx here will be 0, but the value will be be from position 1 in the original list.

但实际上,您不想尝试更改解释器,以便列表从索引1开始。您希望调整算法以使用该语言。

答案 1 :(得分:1)

在Python中,您通常可以避免完全使用索引。该算法可以这样写:

def bottom_up_memo_cut_rod(p,n):
    r = [0]
    for dummy in p:
        r.append(max(a + b for a, b in zip(reversed(r),p)))
    return r[-1]

print bottom_up_memo_cut_rod([1,5,8,9], 4)
#10

答案 2 :(得分:0)

在您的情况下,r[n] len(r)==n的结果是一分为二。您要么写r[n-1],要么更优选r[-1],这意味着“r的最后一个元素”,r[-2]的意思是“倒数第二”等。

无关,但很有用:[ 0 for i in range(n) ]可以写成[0] * n