AHOI2009 中国象棋 题解
在棋盘上摆若干个炮,使得炮之间不攻击,求方案个数 \(\bmod 9999973\) 的值。
考虑 DP,设 \(dp_{i,j,k}\) 表示前 \(i\) 行有 \(j\) 列放了一个炮,有 \(k\) 行放了两个炮。
对于第 \(i\) 行不放的方案:\(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j,k}\)。
对于第 \(i\) 行放一个炮的方案,分情况讨论:
- 炮放在当前行无炮的列中:\(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j-1,k}\times (m-j-k+1)\)。
- 炮放在当前行有一个炮的列中:\(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j+1,k-1}\times (j+1)\)。
对于第 \(i\) 行放两个炮的方案,分情况讨论:
- 炮全放在当前行无炮的列中:\(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j-2,k}\times C_{m-j-k+2}^2\)。
- 炮一个放在无炮的列,一个放在有一个炮的列:\(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j,k-1}\times j\times (m-j-k+1)\)。
- 炮全放在当前有一个炮的列中:\(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j+2,k-2}\times C_{j+2}^2\)。
于是这题就做完了,时间复杂度 \(O(nm^2)\)。