web*_*ebE 10 facebook dynamic-programming
没有找到任何类似的问题.这是最后一轮Facebook问题:
给你一盒盒子.每个盒子上都有一个非负数,可以重复.
编写一个函数/算法,告诉您选择框的顺序,它将为您提供最大总和.
如果您选择一个方框,它就会从环中取出,它旁边的两个方框(在您选择的方框的右侧和左侧)也是如此.
所以,如果我有一个
{10 3 8 12} 的戒指
如果我选择12,8和10将被销毁而你剩下3.
最大值将首先选择8然后选择10,或者先选择10然后选择8.
我尝试通过取自己的值重新分配它们的值,然后减去旁边的两个作为成本.
所以老戒指是{10 3 8 12}
新环是{-5,-15,-7,-6},我会选择最高的.
但是,如果你有{10,19,10,0},这肯定不起作用,你应该取两个10,但算法将取19和0.
请帮忙?
它很可能是动态编程,但我不知道如何.
戒指可以是任何尺寸.
这是解决这个问题的一些Python:
def sublist(i,l):
if i == 0:
return l[2:-1]
elif i == len(l)-1:
return l[1:-2]
else:
return l[0:i-1] + l[i+2:]
def val(l):
if len(l) <= 3:
return max(l)
else:
return max([v+val(m) for v,m in [(l[u],sublist(u,l)) for u in range(len(l))]])
def print_indices(l):
print("Total:",val(l))
while l:
vals = [v+val(m) for v,m in [(l[u],sublist(u,l)) for u in range(len(l)) if sublist(u,l)]]
if vals:
i = vals.index(max(vals))
else:
i = l.index(max(l))
print('choice:',l[i],'index:',i,'new list:',sublist(i,l))
l = sublist(i,l)
print_indices([10,3,8,12])
print_indices([10,19,10,0])
Run Code Online (Sandbox Code Playgroud)
输出:
总数:18
选择:10 索引:0 新列表:[8]
选择:8 索引:0 新列表:[]总数: 20
选择: 10 索引: 0 新列表: [10]
选择: 10 索引: 0 新列表: []
毫无疑问,它可以进行一些优化。关键位是val()
,它计算给定环的总价值。剩下的只是簿记。
归档时间: |
|
查看次数: |
1454 次 |
最近记录: |