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)\)

posted @ 2020-09-05 22:11  cnyz  阅读(127)  评论(0编辑  收藏  举报