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)个炮(就是炮的性质)

原文地址:https://www.cnblogs.com/pyyyyyy/p/12298344.html