是的,您有 8 种可能的方式将标记放在列中:
A B C D E F G H
e * * *
m * *
p * *
t * * *
y
现在,您只能将特定列放在其他列之后。例如:
A可以是任何列的邻居,
- 只能
A做自己的邻居,
B可以是 and 的邻居C,G但不能是另一个Bor ForH的邻居
H只能是A、C或D等的邻居。
需要注意的一件事是,如果给定的列是和A的邻居,这可能很有用。FG
所以我们有一个(无向)图:
A B C D E F G H
A + + + + + + + +
B + - + + + - + -
C + + - + + + - +
D + + + - + - + +
E + + + + - + - -
F + - + + + - + -
G + + - + - + - -
H + - + + - - - -
以上是关联矩阵。
之后,如果列以类型标记放置结束,我们定义A(i)为我们可以从第一列获得的最大可能总和。, , ...,也一样。ii thABCH
然后你有一个递归公式:
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贯穿所有可能的展示位置A, B, C, ..., 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
每个字母都类似。您不必将关联矩阵作为程序中的真实实体,只需在构造表达式时记住它。