hdu 4035 可能性DP 成都网络游戏
生活随笔
收集整理的這篇文章主要介紹了
hdu 4035 可能性DP 成都网络游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://acm.hdu.edu.cn/showproblem.php?pid=4035
獲得:
1、首先推斷是不是樹。事實上,所有的感覺身影,既看邊數==算-1是不成立 ?
2、有時候,我告訴孩子來區分樹仍然是必要的,就是,只是是在dfs的時候,傳參數的時候多加個表示父節點的參數而已
3、一定注意,概率DP對精度真的要求非常高 開始的時候寫1e-8,WA了好幾發,改了1e-10 ?AC
4、注意分母為0的可能的時候加上推斷
講的非常具體的題解:http://blog.csdn.net/morgan_xww/article/details/6776947
直接按公式寫的代碼就是:
當然更好的寫法還是題解上的 #include <cstdio> #include <iostream> #include <vector> #include <cmath> using namespace std; const int MAXN = 10000 + 5; double e[MAXN], k[MAXN]; double A[MAXN], B[MAXN], C[MAXN]; vector<int> v[MAXN]; bool search(int i, int fa) { if ( v[i].size() == 1 && fa != -1 ) { A[i] = k[i]; B[i] = 1 - k[i] - e[i]; C[i] = 1 - k[i] - e[i]; return true; } A[i] = k[i]; B[i] = (1 - k[i] - e[i]) / v[i].size(); C[i] = 1 - k[i] - e[i]; double tmp = 0; for (int j = 0; j < (int)v[i].size(); j++) { if ( v[i][j] == fa ) continue; if ( !search(v[i][j], i) ) return false; A[i] += A[v[i][j]] * B[i]; C[i] += C[v[i][j]] * B[i]; tmp += B[v[i][j]] * B[i]; } if ( fabs(tmp - 1) < 1e-10 ) return false; A[i] /= 1 - tmp; B[i] /= 1 - tmp; C[i] /= 1 - tmp; return true; } int main() { int nc, n, s, t; cin >> nc; for (int ca = 1; ca <= nc; ca++) { cin >> n; for (int i = 1; i <= n; i++) v[i].clear(); for (int i = 1; i < n; i++) { cin >> s >> t; v[s].push_back(t); v[t].push_back(s); } for (int i = 1; i <= n; i++) { cin >> k[i] >> e[i]; k[i] /= 100.0; e[i] /= 100.0; } cout << "Case " << ca << ": "; if ( search(1, -1) && fabs(1 - A[1]) > 1e-10 ) cout << C[1]/(1 - A[1]) << endl; else cout << "impossible" << endl; } return 0; }
版權聲明:本文博客原創文章,博客,未經同意,不得轉載。
轉載于:https://www.cnblogs.com/gcczhongduan/p/4659445.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的hdu 4035 可能性DP 成都网络游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于数据库性能优化小经验
- 下一篇: Webfrom --图片验证码