[AHOI2009]中国象棋(计数dp)
作者:互联网
题意
给定 \(n\) 行 \(m\) 列的棋盘,要求放若干个炮(可以是 \(0\) 个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。\((n, m\le 100)\)
题解
依次考虑每一行放哪些棋子,显然每一行最多放两个,所以可以讨论这 \(0\) ~ \(2\) 个棋子放置的位置。
而其实只需要知道这两个棋子放在了“已经有一个棋子”,“有两个棋子”,“没有棋子”中的哪一种列上。因为如果两种放置方法放在了相同种类的列上,那这两种放置方法就是等价的。
所以可以设 \(f_{i,j,k}\) 表示前 \(i\) 行有 \(j\) 列放了 \(1\) 个,\(k\) 列放了 \(2\) 个(则剩下 \(m-j-k\) 列都放了 \(0\) 个)的方案数。
讨论当前棋子的放置
讨论当前棋子的放置,先自己思考,点击可查看答案
- 不放,\(f_{i+1,j,k}\) += \(f_{i,j,k}\)
- 放一个
- 放在没有棋子的列,\(f_{i+1,j+1,k}\) += \(f_{i,j,k}*(m-j-k)\)
- 放在一个棋子的列,\(f_{i+1,j-1,k+1}+=f_{i,j,k}*j\)
放在两个棋子的列,在想啥嘞不能放在两个棋子的列
- 放两个
- 一个+一个,\(f_{i+1,j-2,k+2}\) += \(f_{i,j,k}*C_j^2\)
- 一个+没有,\(f_{i+1,j,k+1}\) += \(f_{i,j,k}*j*(m-j-k)\)
- 没有+没有,
标签:中国象棋,两个,AHOI2009,放在,一个,棋子,放置,列放,dp 来源: https://www.cnblogs.com/hzy1/p/15061660.html