给出一个有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个数组时。
现在,我不认为我的递归方程式是好的。即使它是,我也不知道如何添加条件(两个标记不能水平或垂直相邻)到递归方程。
有人可以尝试帮忙吗?
答案 0 :(得分:2)
是的,您有8种可能的方法在列中放置令牌:
A B C D E F G H
e * * *
m * *
p * *
t * * *
y
现在,您只能在其他列之后使用特定列。例如:
A
可以是任何列的邻居,A
可以成为自己的邻居,B
可以是C
和G
的邻居,但不能是其他B
或F
或H
的邻居, 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
每封信都类似。您不必将关联矩阵作为程序中的实体,只需在构造表达式时考虑到它。
答案 1 :(得分:0)
这个答案与unkulunkulu的答案实际上是相同的,尽管是独立派生的。我在这里包含它因为使用数组处理它可能更好或更简单。
在下面,让{0..7}中的p
或q
成为八种配置之一的索引,并让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)。