如何在动态编程中获得一组操作

时间:2016-04-24 19:58:04

标签: python dynamic-programming

我想问你如何获得我必须要做的操作列表才能获得结果。

简单的例子:

有一个数字N.你的目标是找出你必须做的最小操作(x / 3,x / 2,x-1)才能得到1。

所以例如minop(10)= 3(因为 1。 10-1 = 9, 2。 9/3 = 3, 3. < / strong> 3/3 = 1)。

这个函数非常简单,在Python中采用自下而上的方法:

# the opt is an optimum nuber of operations for index to get to one
# the op list should be a list of operations but it does not work
# correctly. For minop(10) would return opt = 3 (three
#operations), op = [1,3,3] (minus one, divide three, divide three)

opt = [0,0,0,0,0,0,0,0,0,0,0,0] # optimum number of operation for i
op = []

def minop(n):
    opt[1]=0
    for i in range(2,n+1):
        opt[i]=opt[i-1]+1
        op.append(1) # INCORRECT
        if i%2==0:
            opt[i] = min(1+opt[i/2],opt[i])
            op[-1]=2 # INCORRECT
        if i%3==0:
            opt[i] = min(1+opt[i/3],opt[i])
            op[-1]=3 # INCORRECT
    return opt[n],op

正如您所看到的,操作列表应包含从n1所需的最小操作列表(由数字表示),但它包含。

1 个答案:

答案 0 :(得分:1)

代码中最重要的错误是,即使操作没有产生更好的结果,您也会在opt[i]块中更新if

以下是您的代码的更正版本:

def minop(n):
    op = [[], []]
    for i in range(2,n+1):
        ref = i-1
        best = 1
        if i%2==0 and len(op[i/2]) < len(op[ref]):
            ref = i/2
            best = 2
        if i%3==0 and len(op[i/3]) < len(op[ref]):
            ref = i/3
            best = 3
        op.append([best] + op[ref][:]) # slice to get separate copy
    return len(op[n]), op[n]

print minop(10)

输出:

(3, [1, 3, 3])

含义:3个操作,-1/3/3

eval.in

上查看它