随机跳题都给我跳些神马玩意
看了数据范围,感觉 $m$ (边数)应该只是做权值的,时间应和 $n$ 关系大些(毕竟 $n \le 18, m \le 10^5$ ),先考虑了暴力,暴搜走法,以边数为权值,时间复杂度为 $O(n!)$ 期望30分(我也没打所以正确性没保证)
然后继续以 $m$ 为权值的思路,考虑状压dp,设 $f[i][j][w]$ 表示“走到点 $i$ ,当前点集合为 $j$ 且当前代价为 $w$ 的方案数”,转移很显然,下面以 $w = 0$ 的转移为例:
$$
\begin{align}
&\text{设当前地图为}j \text{(不存在}v \text{),和为}sum(j) \text{且存在边}u \rightarrow v \text{数为}mp[u][v] \text{,} j + v \text{指将点}v \text{压入状态}\\
&f[v][j + v][0] += mp[u][v] *
\begin{cases}
f[u][j][0] & if(v \mod 2 = 0)\\
f[u][j][0] & if(v \mod 2 = 1 \wedge sum(j) \mod 2 = 0)\\
f[u][j][1] & if(v \mod 2 = 1 \wedge sum(j) \mod 2 = 1)
\end{cases}
\end{align}
$$
打的很快,注意了取模,结果一交——WA
想对着样例调一下,于是翻出了2018的比赛(这是那次比赛的第三题),正打算下载样例,结果……谁家出题组样例用百度网盘发呀!下一个百度网盘太麻烦,于是放弃,只好对着死调
就在我万念俱灰之时,突然感觉 $f[i][j][w]$ 的顺序怪怪的,因为dp的无后效性是用第二维(当前点集只增不减)来保证的,那么是不是应该先枚举 $j$ 再枚举 $i$ 呢?怀着如果还不过就只有手造样例心态,把第二层循环调到了最外层,结果,柳暗花明又一村,AC了!
代码
1 |
|
感觉这个状压比较简单,毕竟连我这种奆弱都可以做
说句题外话,找样例的时候虽然样例没找到,但发现GodFly是“牛虻”的意思