跳棋板 - DP

时间:2013-05-11 09:38:20

标签: algorithm language-agnostic dynamic-programming

给出一个有4行和N列的跳棋板。矩阵中的每个单元都有一个值。 给定需要放置在板上的2N个令牌(每个都在一个单元格上),因此矩阵单元格中所有值的总和将尽可能大(最大值)。

放置代币的限制是两个代币不能相互水平或垂直相邻。

您不必放置所有2N令牌。

在列中放置令牌有八种合法方法,因此当我们每个都描述一个选项时,我定义了8个大小为N的数组。

无论如何,使用动态编程,我需要为问题建立一个递归方程。

我想出了:

A(i,j) = max { A(i,j) , A(i,j) + max { A(i-1,j-1) , ... , H(i-1,j-1) } } , B(i,j) = .... , H(i,j) = ...

A是第一个数组且H是第8个数组时。

现在,我不认为我的递归方程式是好的。即使它是,我也不知道如何添加条件(两个标记不能水平或垂直相邻)到递归方程。

有人可以尝试帮忙吗?

2 个答案:

答案 0 :(得分:2)

是的,您有8种可能的方法在列中放置令牌:

A B C D E F G H
e *       *   *
m   *       *
p     *   *
t       *   * *
y

现在,您只能在其他列之后使用特定列。例如:

  1. A可以是任何列的邻居,
  2. 只有A可以成为自己的邻居,
  3. B可以是CG的邻居,但不能是其他BFH的邻居,
  4. H只能是ACD等的邻居。
  5. 需要注意的一点是,如果给定列与AF相邻,G会很有用。

    所以我们有一个(无向)图表:

      A B C D E F G H
    A + + + + + + + +
    B + - + + + - + -
    C + + - + + + - +
    D + + + - + - + +
    E + + + + - + - -
    F + - + + + - + -
    G + + - + - + - -
    H + - + + - - - -
    

    以上是关联矩阵。

    之后,如果A(i)列以类型i令牌展示位置结束,我们会将i th定义为我们可以从前A列获得的最大总和。 BC,...,H也是如此。

    然后你有一个递归公式:

    X(i+1) = {max Y(i) where X and Y can be neighboring columns} + 
             {sum of the cells in the i+1 column for placement X}
    

    此处X会浏览所有可能的展示位置ABC,...,H

    初始值为A(0) = 0, B(0) = 0, ..., H(0) = 0

    最终答案是max{ A(N), B(N), C(N), D(N), ..., H(N) }

    注意:

    以上是解决方案,或者想法,实施可以是不同的。例如,您可以对所有内容进行硬编码(假设Board[i][j]是放在主板上的值,索引从0开始):

    F(i+1) = max{ A(i), C(i), E(i), G(i) } +  // This is from the matrix above
             Board[0][i+1] + Board[2][i+1]    // This is from the definition of F type column
    

    每封信都类似。您不必将关联矩阵作为程序中的实体,只需在构造表达式时考虑到它。

答案 1 :(得分:0)

这个答案与unkulunkulu的答案实际上是相同的,尽管是独立派生的。我在这里包含它因为使用数组处理它可能更好或更简单。

在下面,让{0..7}中的pq成为八种配置之一的索引,并让k成为列索引。设V(k,p)p列中配置k的值。设W(k,p)0..k列的最佳配置值,该列以p列中的配置k结尾。如果允许配置φ(p,q)相邻,则p,q为1,否则为0.(φ相当于unkulunkulu的图关联矩阵。)符号∞表示大于矩阵正的总和的数字细胞价值。

然后W(k + 1,p)=​​ V(k + 1,p)+ max q∈{0..7} (W(k,q)·φ(p, q)+∞·(φ(p,q)-1))
当k≥0时,W(0,p)= V(0,p)。