題目描述:一棵樹,乙個人初始在1號點。每次到達乙個點,有ki的概率被殺死,並且回到1號點,有ei的概率直接逃離,然後等概率的逃到與他相鄰的節點(1-ki-ei)/du[i],每次移動步數+1。 求逃出去的期望步數。
這道題與上面題的思想和方法是類似的。
我們先假設逃離是到達節點0, 那麼e[0]=0,倒著推。
對於葉子節點,他要麼逃到他的父親節點,要麼被殺,要麼直接逃離 e[
i]=(
1−ki
−ei)
∗e[f
a[i]
]+ki
∗e[1
]+e[
0]∗e
i 因為e[0]=0 ,所以式子最終可以化簡成e[
i]=(
1−ki
−ei)
∗e[f
a[i]
]+ki
∗e[1
]+(1
−ki−
ei)
那麼在這個式子中e[
fa[i
]],e
[1] 是未知量,那麼我們可以把式子化簡成 e[
i]=a
[i]∗
e[fa
[i]]
+b[i
]∗e[
1]+c
[i] 的形式。
對於非葉子節點 e[
i]=(
e[fa
[i]]
+1+∑
(e[s
on[i
]]+1
))∗(
1−ki
−ei)
du[i
]+e[
1]∗k
i 對於e[son[i]]來說,如果化成e[
i]=a
[i]∗
e[fa
[i]]
+b[i
]∗e[
1]+c
[i] 的形式,那麼我們可以發現e[
fa[s
on[i
]]] 實際上就是e[i],那麼我們可以對式子進行進一步的化簡。 e[
i]=(
e[fa
[i]]
+1+∑
(a[s
on[i
]]∗e
[i]+
b[so
n[i]
]∗e[
1]+c
[son
[i]]
+1))
∗(1−
ki−e
i)du
[i]+
e[1]
∗ki
我們設(1−
ki−e
i)du
[i]=
p[i]
式子整理得 (1
−p[i
]∗∑a
[son
[i]]
)∗e[
i]=p
[i]∗
e[fa
[i]]
+(ki
+p[i
]∗∑b
[son
[i]]
)∗e[
1]+(
1−ki
−ei)
+p[i
]∗∑c
[son
[i]]
最後把(1
−p[i
]∗∑a
[son
[i]]
) 除過來,就可以得到a[
i],b
[i],
c[i]
最後的答案就是c[
1]/(
1−b[
1])
注意在計算的過程中只要e[i]的係數趨近與0,那就是impossible
#include
#include
#include
#include
#include
#define n 200003
#define eps 1e-9
using
namespace
std;
int n,point[n],v[n],nxt[n],du[n],tot,t;
double a[n],b[n],c[n],k[n],e[n];
void add(int x,int y)
bool dfs(int x,int fa)
if (fabs(t)return
false;
a[x]/=t; b[x]/=t; c[x]/=t;
// couttrue;
}int main()
for (int i=1;i<=n;i++)
bool pd=dfs(1,0);
printf("case %d: ",t);
if (fabs(1.0-b[1])printf("impossible\n");
else
printf("%.6lf\n",c[1]/(1-b[1]));
}}
HDU 4035 Maze 樹形概率DP
題意 一棵樹,從結點1出發,在每個結點 i 都有3種可能 1 回到結點1 概率 ki 2 結束,概率 ei 3 隨機走一條邊。ki ei 隨機走 1 求到結束需要走的邊數的期望。假設e i 為點i到結束走邊數的期望,則有 以下m為點的度數 e i ki e 1 1 ei ki m e fa i 1 ...
hdu4035 Maze 期望dp 數學
bzoj4035 神題啊。orz 不過網上題解好難看,數學推導不寫 latex 怎麼看。latex中毒晚期 我們由題當然能很快寫出 dp 方程 設 f i 表示從 u 出發逃離的期望步數,m 為該點度數 begin f u k uf 1 frac sum limits f v 1 k uf 1 fr...
hdu4035 樹上概率dp
從葉子到根,帶入公式求引數 kuangbin hdu 4035 dp求期望的題。題意 有n個房間,由n 1條隧道連通起來,實際上就形成了一棵樹,從結點1出發,開始走,在每個結點i都有3種可能 1.被殺死,回到結點1處 概率為ki 2.找到出口,走出迷宮 概率為ei 3.和該點相連有m條邊,隨機走一條...