P2051 [AHOI2009]中国象棋

题目链接

P2051 [AHOI2009]中国象棋

思路

  • \(30pts:\)

显然枚举每一行来放即可

  • \(50pts:\)

尝试优化\(30\)分的方法

显然对于\(30\)分来说,每行枚举的情况就\(3\)种,放\(0\)个炮,\(1\)个炮,\(2\)个炮(再多放就不合法了)

来分析(瞎逼逼一波)一下为毛它很慢

更为显然的是它在以前的状态转移时有重新计算了一遍,有点\(sb\),于是乎我们可以记忆化

\(f[i][j]\) 表示放到第\(i\)行,当前第\(i\)行的状态是\(j\)\(j\)是三进制压缩,然后枚举转移

  • \(100pts:\)

观察一下\(50\)分做法

显然对于一个位置\(1\)个炮的转移时唯一的(从零个变一个)

对于两个炮的转移也是唯一的(从一个变两个)

那么我们需要记录的状态仅仅时\(1\)个炮和\(0\)个炮即可,没必要记录\(2\)个炮(反正它也不转移)

\(f[i][j][k]\)表示到第\(i\)行,有\(j\)个放了一个的,有\(k\)个放了\(0\)个的

转移就是先判断状态能不能到达,然后再枚举从那个转移

初始化时把\(f[0][0][m]\)设成\(1\),然后用组合数统计

  • 总结

总体而言,这道题利用了炮的性质(好像大部分的中国象棋类题目都是如此)

其中关键在于按照行(列)来设立状态并且能以试到每行(列)最多\(2\)个炮(就是炮的性质)

猜你喜欢

转载自www.cnblogs.com/pyyyyyy/p/12298344.html
今日推荐