洛谷P2395题解

题面

看到数据范围显然是个状压DP。
考虑记录两个数组, \(dis\)\(f\)\(dis\) 数组表示当前状态走了多少路程, \(f\) 数组表示当前状态有多少种走法。
显然 \(dis\) 数组可以随便推,在当前状态中随便取一位 \(p\) ,然后计算 \(dis_s=dis_{s-p}+dis_p\) 即可。
但是 \(f\) 数组较为难推。首先, \(f\) 数组可以参照 \(dis\) 数组的推法,但是,我们这次要用全部合法的 \(p\) 来进行转移,但是如果暴力枚举每一位 \(p\) 是否合法会T,所以我们要用一个trick,就是在写树状数组时用的 \(\operatorname{lowbit}\) 。 $$f_s=f_s+f_t, t\in s$$

代码

注:本题非常卡时空,所以不能 #define int ll 否则MLE。

posted @ 2021-08-11 05:11  1358id  阅读(51)  评论(0编辑  收藏  举报