如何在 O(n) 中使用 DP 计算预期转数?

How to calculate expected number of turns using DP in O(n)?

单人棋盘游戏。该板由一排 n 个单元格组成,从左到右编号为 1 到 n 正确的。单元格“j”包含一个正整数 cj。 规则是这样的:

  1. 您从最左边的单元格开始。
  2. 在每一轮中,您掷出一个公平的 6 面骰子,结果数字为 A。你 向前移动 A × cj 个单元格,其中 j 是您所在单元格的索引 上。
  3. 退出棋盘即为赢,即指数 j > n 为赢。

例如,考虑大小为 n=10 的棋盘 首先,您位于第一个值为 c1 = 2 的单元格中。在第一轮中,您掷骰子 并获得一个值 1,所以你向前移动 2 个单元格。然后在下一次掷骰中,您在单元格 3 上掷出 5 (c3 = 4),所以你向前移动 20 个单元格会让你退出棋盘。你赢了!!你拿了 2 轮到赢了。

如何使用运行时间为 (n) 的动态规划算法计算上述游戏获胜所需的预期回合数?

您要查找的递归关系是:

E[j] = 0 (if j > n)
E[j] = 1 + 1/6 * sum_k(E[j + k * c_j]) (otherwise, for k \in 1..6)

对于每个单元格,计算平均获胜的回合数。

对于 k>=n 的单元格[k],这是 0。

对于其他k处获胜的次数为1加上回合的平均值

缓存结果并且不重新计算它们。

Return从格子0转为获胜

是的,这似乎没什么不明显的。动态编程似乎不做任何不明显的事情,在朴素算法的中间有一个适当限制的缓存。

诀窍是将问题安排为具有良好边界的缓存,从而使天真的算法崩溃而无法做太多工作。