相关习题:
1. Uva 10237 Bishops
题意:两个象不攻击,当且仅当它们不处在同一条斜线上。输入整数$n(n leq 30)$,统计在一个$n imes n$的棋盘上放$k$个互不攻击的象有多少种方法。如$N=8, k = 6$时有$5599888$种。
分析:解决本题需要注意两个事实:
1.在棋盘上着色(如上图)不同的位置互不相干,因此可以独立处理。
2.每个放置象的位置独占某一列(对角线意义上)和某一行。
因此可初步得到如下的状态转移方程,用$dp(i, j)$表示在前$i$行(第$i$行有$l(i)$个棋格,假设$l(i)$严格对称递增)共放置$j$个象的方案数:
$dp(i, j) = dp(i - 1, j - 1) * (l(i) - j + 1) + dp(i, j)$其中$+$号左边表示在第$i$行放置一个象,右边表示不放。
只需要对奇数列和偶数列(行的长度)分别计算$dp$数组,最后用乘法合并成一个方格棋盘。对于本题至于将前半部分和后半部分相邻处理即可dp。