P2051 [AHOI2009]中国象棋
Posted pyyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)个炮(就是炮的性质)
以上是关于P2051 [AHOI2009]中国象棋的主要内容,如果未能解决你的问题,请参考以下文章