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