采摘元素游戏

时间:2012-11-29 22:30:15

标签: algorithm dynamic-programming

这是一个简单的游戏:
有一个集合,A = {a1,...,an},对手可以选择集合的第一个或最后一个元素之一,最后收集更多数字的人获胜。现在说每个参与者都是最好的,我需要做的是写一个动态算法来估计他们的分数 任何想法或线索都是真正的赞赏。

4 个答案:

答案 0 :(得分:2)

这里有一个提示:要编写动态编程算法,通常需要重复。鉴于

A={a1,...,an}

重复发生看起来像这样

f(A)= max( f({a1,...,a_n-1}) ,  f({a2,...,a_n}) )

答案 1 :(得分:1)

实际上,dfb给出的递归关系可能不会导致正确答案 因为它没有导致正确的次优结构! 假设玩家A开始游戏: 他的问题结构是[a1,a2,... an] 选择一个元素,a1或a之后,它的玩家B轮到玩,然后在那个移动之后它就是玩家A的移动。 因此,在两次移动之后,玩家A的回合将再次出现,这对他来说是正确的子问题。正确的复发关系将是

假设从i到j元素被留下:

A(i,j)= max(min( A(i+1,j-1),A(i+2,j)+a[i] ), min(A(i,j-2),A(i+1,j-1))+a[j])

请参阅以下链接: http://people.csail.mit.edu/bdean/6.046/dp/

答案 2 :(得分:0)

实际上你不需要动态编程,因为很容易为上面的游戏找到一个明确的解决方案。

案例n是偶数或n = 1。 第二个移动的玩家将永远失败。

案例n odd和n> 1。 如果发生以下两种情况之一,第二位玩家将获胜:

  1. 具有偶数索引的元素的总和大于具有奇数索引的所有元素

  2. 除了最后一个元素之外的所有奇数元素都比所有剩余的AND更大 除了第一个元素之外的所有奇数元素都比所有剩余元素都要大。

  3. 证明草图:

    情况n是偶数或n = 1:让Sodd和Seven为具有偶数/奇数索引的所有元素的总和。假设Sodd>七,相同的论点另有说法。第一个玩家有一个获胜策略,因为他可以这样玩,他将得到所有奇数索引项目。

    情况n是奇数并且n> 1也可以直接解决。事实上,第一个玩家有两个选项,他可以获得该组的第一个或最后一个元素。在剩余的元素中,用奇数和偶数索引将它们分成两个子集;通过上面的论证,第二个玩家将采用具有最大总和的子集。如果你展开树形游戏,你最终会得到上面的陈述。

答案 3 :(得分:0)

示例代码

这是用于计算第一和第二玩家的最佳分数的Python代码。

A=[3,1,1,3,1,1,3]

cache={}
def go(a,b):
    """Find greatest difference between player 1 coins and player 2 coins when choosing from A[a:b]"""
    if a==b: return 0 # no stacks left
    if a==b-1: return A[a] # only one stack left
    key=a,b
    if key in cache:
        return cache[key]

    v=A[a]-go(a+1,b) # taking first stack
    v=max(v,A[b-1]-go(a,b-1)) # taking last stack

    cache[key]=v
    return v

v = go(0,len(A))
n=sum(A)
print (n+v)/2,(n-v)/2

相反实施

请注意,该代码包含此问题的其他答案之一的反例。

考虑案例[3,1,1,3,1,1,3]。

通过对称,第一个玩家移动总是留下模式[1,1,3,1,1,3]。

为此,偶数元素的总和为1 + 3 + 1 = 5,而奇数之和为1 + 1 + 3 = 5,因此参数是从第二个玩家总是赢得5,并且第一个玩家将总是赢得5,所以第一个玩家将获胜(因为他除了第一个移动中的3个之外还获得5个)。

但是,这种逻辑是有缺陷的,因为第二个玩家实际上可以获得更多。

First player takes 3, leaves [1,1,3,1,1,3] (only choice by symmetry)
Second player takes 3, leaves [1,1,3,1,1]
First player takes 1, leaves [1,3,1,1] (only choice by symmetry)
Second player takes 1, leaves [1,3,1]
First player takes 1, leaves [3,1] (only choice by symmetry)
Second player takes 3, leaves [1]
First player takes 1

所以整体第一名玩家获得3 + 1 + 1 + 1 = 6,而第二名获得3 + 1 + 3 = 7且第二名玩家获胜。

缺点是虽然第二个玩家可以玩这样的游戏来赢得所有偶数或所有奇数位置,但这不是最佳游戏,在某些情况下他们实际上可以做得更好。