AHOI2009 中国象棋 题解

在棋盘上摆若干个炮,使得炮之间不攻击,求方案个数 (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))

原文地址:https://www.cnblogs.com/lajiccf/p/13619964.html