Imagine that a chessboard with black and white squares. If a bishop is on a white square, can it attack bishops on black squares? No. So you can divide the chessboard into two independent ones. Then rotate each board for PI/4 and now the diagonal line becomes vertical. Now the problem of bishops becomes that of rooks.
We denote the number of cells of the i'th row contains with r[i]. In fact, the order of rows does not matter, so we can sort the rows with r[i]. We use c[i][j] to represent the number of cases to put j rooks in the first i rows. The we have the following recurrence,
c[i][j] = c[i-1][j] + c[i-1][j-1] * (r[i] - (j-1))
with the boundary conditions,
c[i][0] = 1, 0 <= i <= n, and
c[0][j] = 0, 1 <= j <= k
Now, we have got the results of the two boards. A simple accumulation would give us the final results.
Code:
本文介绍了一种计算棋盘上主教放置的方法,通过将棋盘分为黑白两个独立部分并转换为车的放置问题,利用动态规划求解不同数量的主教在棋盘上的合法放置方案。
304

被折叠的 条评论
为什么被折叠?



