题目:
算一种可行方案,只要确定出 n 条边即可;概率就是这 n 条边存在的概率,其他边视作无要求,概率贡献都是1;这样的话,一种方案对答案的贡献就是其概率。
考虑把第二组边和第三组边分成概率分别为 1/2 的两条独立的边。对于第二组边再加一条能把4个点都连起来的 1/4 的边,对于第三组边再加一条能把4个点都连起来的 -1/4 的边。
因为算一个方案的概率的时候只看选中的边的概率乘积,所以上述方案可以让概率计算正确。
可以设 dp[ s0 ][ s1 ] 表示左部的点集 s0 和右部的点集 s1 匹配的期望方案数。然后记忆化搜索。(也可以刷表,还会快,但不太会写)
为了避免方案数因为加边顺序而算重,可以规定一个顺序,比如转移到 (s0,s1) 的状态 (d0,d1) 的 d0 一定不含 s0 的 lowbit 之类的。
于是枚举 d0 , d1 ,但会TLE。
#include #include #include #include
View Code 于是改成枚举每条边,并且把两个点集压进一个数而不是两个数里。但还是TLE。
#include #include #include #include
View Code 主要是 map 的大小。在 mp[ s0 ] 里找有没有 s1 比在整个 (s0,s1) 里找有没有 (s0,s1) 快。
并且不要写很多 mp[ s0 ][ s1 ] ,可以用一个临时变量 ret 之类的代替。
#include #include #include #include