总结玩家在双人游戏中可以拥有的所有可能值

时间:2012-10-13 13:49:46

标签: dynamic-programming memoization expectations

这是一款经典游戏,其中两位玩家玩下面的游戏:

连续有n个硬币,面额不同。在这个游戏中,玩家从最左边或最右边挑选一枚硬币(他们盲目地选择任何极端,概率为0.5,两者都是愚蠢的)。我只想计算开始游戏的玩家的预期总和。

为此,我想总结玩家可以拥有的所有值的组合。我正在使用递归解决方案,它总结了所有可能的结果值,但它有重叠的子问题。我想提高效率,并想要记住这些重叠的子问题。

我无法收集执行它的逻辑。请有人帮忙。

1 个答案:

答案 0 :(得分:0)

想法是为每个行子区间存储两个玩家的总和。

F(start, end)表示第一个玩家在间隔[start, end]上玩的可能总和。类似的定义S(start, end)。我们可以使用字典存储可能的总和,例如{2: 0.25, 5: 0.25, 6: 0.5}

比递归持有:

F(start, end) = {row[end]  +sum: p/2,  for sum,p in S(start, end-1)} +
                {row[start]+sum: p/2,  for sum,p in S(start+1, end)}
S(start, end) = {sum: p/2, for sum,p in F(start, end-1)} +
                {sum: p/2, for sum,p in F(start+1, end)}
F(start, end) = {row[start]: 1} if start == end
S(start, end) = {} if start == end

这可以通过增加间隔长度来计算:

for length = 0 to row_length-1:
  for start = 1 to row_length - length:
    calculate `F(start, start+length)` and `S(start, start+length)`

字典F(1, row_length)S(1, row_length)用于计算预期金额。