日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4035 Maze 【期望dp + 数学】

發布時間:2025/3/15 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4035 Maze 【期望dp + 数学】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接

BZOJ4035

題解

神題啊。。。orz
不過網上題解好難看,數學推導不寫\(Latex\)怎么看。。【Latex中毒晚期】

我們由題當然能很快寫出\(dp\)方程
\(f[i]\)表示從\(u\)出發逃離的期望步數,\(m\)為該點度數
\[ \begin{aligned} f[u] &= K_uf[1] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge} (f[v] + 1)\\ &= K_uf[1] + \frac{1 - K_u - E_u}{m}f[fa[u]] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge \& v \ne fa[u]} f[v] + (1 - K_u - E_u)\\ \end{aligned} \]
然后就會發現這個方程似乎有后效性,立即想高斯消元
一看范圍\(n \le 10^4\)什么鬼嘛QAQ。。。

題解是這么說的:
我們設
\[f[u] = A_uf[1] + B_uf[fa[u]] + C_u\]
對于葉子節點,顯然有
\[ \begin{aligned} A_u &= K_u \\ B_u &= 1 - K_u - E_u \\ C_u &= 1 - K_u - E_u \\ \end{aligned} \]
對于非葉節點,我們展開\(f[v]\)
\[ \begin{aligned} f[u] &= K_uf[1] + \frac{1 - K_u - E_u}{m}f[fa[u]] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge \& v \ne fa[u]} f[v] + (1 - K_u - E_u)\\ &= K_uf[1] + \frac{1 - K_u - E_u}{m}f[fa[u]] + \frac{1 - K_u - E_u}{m}\sum\limits_{(u,v) \in edge \& v \ne fa[u]} (A_vf[1] + B_vf[u] + C_v) + (1 - K_u - E_u)\\ \end{aligned} \]

我們整理一下:
\[f[u] = \frac{K_u + \frac{1 - K_u - E_u}{m}\sum A_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v}f[1] + \frac{\frac{1 - K_u - E_u}{m}}{1 - \frac{1 - K_u - E_u}{m}\sum B_v}f[fa[u]] + \frac{1 - K_u - E_u - \frac{1 - K_u - E_u}{m}\sum C_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v}\]

\[ \begin{aligned} A_u &= \frac{K_u + \frac{1 - K_u - E_u}{m}\sum A_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v} \\ B_u &= \frac{\frac{1 - K_u - E_u}{m}}{1 - \frac{1 - K_u - E_u}{m}\sum B_v} \\ C_u &= \frac{1 - K_u - E_u - \frac{1 - K_u - E_u}{m}\sum C_v}{1 - \frac{1 - K_u - E_u}{m}\sum B_v} \\ \end{aligned} \]
然后由于
\[ \begin{aligned} f[1] &= A_1f[1] + B_1 \times 0 + C_1 \\ f[1] &= \frac{C_1}{1 - A_1} \end{aligned} \]
\(1 - A_1 = 0\)時無解
否則我們能直接計算出\(f[1]\),即為所求

是不是很神奇?
這個式子的推導主要是利用了式子中有\(f[fa[u]]\)這一項,從而可以從兒子中遞推出父親的信息

#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define REP(i,n) for (int i = 1; i <= (n); i++) #define mp(a,b) make_pair<int,int>(a,b) #define cls(s) memset(s,0,sizeof(s)) #define cp pair<int,int> #define LL long long int #define eps 1e-10 using namespace std; const int maxn = 10005,maxm = 100005,INF = 1000000000; inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag; } int n,h[maxn],ne,de[maxn],fa[maxn]; struct EDGE{int to,nxt;}ed[maxn << 1]; void build(int u,int v){ed[++ne] = (EDGE){v,h[u]}; h[u] = ne;ed[++ne] = (EDGE){u,h[v]}; h[v] = ne;de[u]++; de[v]++; } double A[maxn],B[maxn],C[maxn],K[maxn],E[maxn]; int dfs(int u){if (de[u] == 1 && u != 1){A[u] = K[u];B[u] = C[u] = 1 - K[u] - E[u];return true;}double m = de[u],tmp = 0;A[u] = K[u];B[u] = (1 - K[u] - E[u]) / m;C[u] = 1 - K[u] - E[u];Redge(u) if ((to = ed[k].to) != fa[u]){fa[to] = u; if (!dfs(to)) return false;A[u] += A[to] * B[u];C[u] += C[to] * B[u];tmp += B[to] * B[u];}if (fabs(1 - tmp) < eps) return false;A[u] /= (1 - tmp); B[u] /= (1 - tmp); C[u] /= (1 - tmp);return true; } int main(){int T = read();for (int t = 1; t <= T; t++){n = read(); cls(de); cls(h); ne = 1;for (int i = 1; i < n; i++) build(read(),read());for (int i = 1; i <= n; i++) K[i] = read() / 100.0,E[i] = read() / 100.0;printf("Case %d: ",t);if (!dfs(1) || fabs(A[1] - 1) < eps) puts("impossible");else printf("%.10lf\n",C[1] / (1 - A[1]));}return 0; }

轉載于:https://www.cnblogs.com/Mychael/p/9077231.html

總結

以上是生活随笔為你收集整理的hdu4035 Maze 【期望dp + 数学】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。