标签:初始化 转移 思路 观察 链接 状态 组合 str tps
显然枚举每一行来放即可
尝试优化\(30\)分的方法
显然对于\(30\)分来说,每行枚举的情况就\(3\)种,放\(0\)个炮,\(1\)个炮,\(2\)个炮(再多放就不合法了)
来分析(瞎逼逼一波)一下为毛它很慢
更为显然的是它在以前的状态转移时有重新计算了一遍,有点\(sb\),于是乎我们可以记忆化
用\(f[i][j]\) 表示放到第\(i\)行,当前第\(i\)行的状态是\(j\),\(j\)是三进制压缩,然后枚举转移
观察一下\(50\)分做法
显然对于一个位置\(1\)个炮的转移时唯一的(从零个变一个)
对于两个炮的转移也是唯一的(从一个变两个)
那么我们需要记录的状态仅仅时\(1\)个炮和\(0\)个炮即可,没必要记录\(2\)个炮(反正它也不转移)
用\(f[i][j][k]\)表示到第\(i\)行,有\(j\)个放了一个的,有\(k\)个放了\(0\)个的
转移就是先判断状态能不能到达,然后再枚举从那个转移
初始化时把\(f[0][0][m]\)设成\(1\),然后用组合数统计
总体而言,这道题利用了炮的性质(好像大部分的中国象棋类题目都是如此)
其中关键在于按照行(列)来设立状态并且能以试到每行(列)最多\(2\)个炮(就是炮的性质)
标签:初始化 转移 思路 观察 链接 状态 组合 str tps
原文地址:https://www.cnblogs.com/pyyyyyy/p/12298344.html