在棋盘上摆若干个炮,使得炮之间不攻击,求方案个数 (mod 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} imes (m-j-k+1))。
- 炮放在当前行有一个炮的列中:(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j+1,k-1} imes (j+1))。
对于第 (i) 行放两个炮的方案,分情况讨论:
- 炮全放在当前行无炮的列中:(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j-2,k} imes C_{m-j-k+2}^2)。
- 炮一个放在无炮的列,一个放在有一个炮的列:(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j,k-1} imes j imes (m-j-k+1))。
- 炮全放在当前有一个炮的列中:(dp_{i,j,k}=dp_{i,j,k}+dp_{i-1,j+2,k-2} imes C_{j+2}^2)。
于是这题就做完了,时间复杂度 (O(nm^2))。