[SSOI3045] 迷雾森林(forest)

题目描述

哀伤小径下方是迷雾森林.
点燃迷雾森林的氤氲灯笼,可以驱散迷雾森林的迷雾。
点燃氤氲灯笼的火把由k个不同碎片组成,拿到k个碎片并带着这k个不同碎片来到氤氲灯笼的位置便可以点亮氤氲灯笼。
为了方便,氤氲灯笼的位置设在1号点,而Ori要从1号点出发。
迷雾森林没走过一个点便会进行变换 因此从一个点出发通往的下一个点是随机的(具体见样例),而两两点之间的道路长度均为1,Ori想要知道这样一直走下去期望要走多少次才能点亮氤氲灯笼。

输入

第一行:n ,k 表示点数和火把的碎片数
接下来k个整数,表示火把的碎片所在的节点。
接下来一个n∗n的矩阵S S(i,j) 表示从第 i 个点出发走到第 j 个点的概率。
保证每行总和与 1 1相差不超过 0.0001(假装是1吧,剩下的1e-4你可以看做Ori被Lantia n72 抓走了)

输出

一个实数,表示期望的步数,保留 3 3 位小数,如果永远无法完成则输出 'Ori!'

样例输入

3 2
2 3
0 0.5 0.5
0.5 0 0.5
0.5 0.5 0

样例输出

5.000

提示

对于第1个点, S(i,j)=01 S(i,j)=0或1
对于第2、3、4个点,所有可能的路径形成一棵树,每个叶子节点有且仅有一条\
S(i,1)=1 S(i,1)=1
对于第 5、 6个点, n15,k3 n≤15,k≤3
对于100%的数据, n100,k6 n≤100,k≤6


orzlt大神%%%%%%



非常难的一题,大概是我太弱。

先考虑没有碎片。直接高斯消元,效率n³。设从i号点回到1号的期望是Ei,则E1=0,;Ei=∑(Ej+1)*P(i,j)。

考虑有碎片,那就分层,状压s表示每个点的状态。E(i,2的n次方-1)=0;照推。效率(2的n次方*n)³

再考虑每一层,只可能每层状态出现环,不同状态不会出现环,所以用DP处理不同状态的解,高斯消元处理相同状态的解。因为已知E(i,2的n次方-1)=0,所以状态s由大往小推。对每个节点i与状态s,可列得等式E(i,s)=∑(E(j,s)+1)*P(i,j)(s|h[j]==s)+∑(E(j,s|h[j])+1)*P(i,j)(s|h[j]≠s)。因为从大开始做,所以+∑(E(j,s|h[j])+1)*P(i,j)(s|h[j]≠s)可以当做常数N。列得高斯消元方程组E(i,s)-P(i,j)E(j,s)-.........=1+N。




没有代码没有写,嘻嘻。







你可能感兴趣的:(未写)