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 <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS = 1e-10;
const int INF = 100000000;
const int MAXN = 10000+100;vector<int>g[MAXN];
double k[MAXN],e[MAXN];
double a[MAXN],b[MAXN],c[MAXN];
int n;bool sea(int i, int fa)
{if(g[i].size() == 1 && fa!=-1)//叶子节点{a[i]=k[i];c[i]=b[i]=1.0-k[i]-e[i];return true;}//非叶子节点,此时该非叶子节点的子孙都已经遍历过了double aa=0.0,bb=0.0,cc=0.0;for(int j=0;j<g[i].size();j++){if( g[i][j] == fa)continue;if(!sea(g[i][j],i))return 0;aa+=a[g[i][j]];bb+=b[g[i][j]];cc+=c[g[i][j]];}int m=g[i].size();a[i]=(k[i]+(1-k[i]-e[i])/m*aa)/(1-(1.0-k[i]-e[i])/m*bb);b[i]=(1.0-k[i]-e[i])/m/(1.0-(1.0-k[i]-e[i])/m*bb);c[i]=( (1.0-k[i]-e[i])+(1.0-k[i]-e[i])/m*cc )/(1.0 -(1.0-k[i]-e[i])/m*bb);return true;
}int main()
{int ncase,u,v,ic=0;scanf("%d",&ncase);while(ncase--){scanf("%d",&n);for(int i=1;i<=n;i++)g[i].clear();for(int i=1;i<n;i++){scanf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}for(int i=1;i<=n;i++){scanf("%lf%lf",&k[i],&e[i]);k[i]/=100.0;e[i]/=100.0;}printf("Case %d: ",++ic);if(sea(1,-1) && fabs(1.0-a[1])>EPS)printf("%.6lf\n",c[1]/(1.0-a[1]));elseprintf("impossible\n");}return 0;
}
当然更好的写法还是题解上的
#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
hdu 4035 可能性DP 成都网络游戏相关推荐
- poj 2096 , zoj 3329 , hdu 4035 —— 期望DP
题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...
- HDU - 4734 F(x) (2013成都网络游戏,数字DP)
意甲冠军:求0-B见面<=F[A]所有可能的 思维:数字DP,内存搜索 #include <iostream> #include <cstring> #include & ...
- HDU 4035 Maze(树形概率DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...
- HDU - 4035 Maze(概率dp)
题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...
- HDU 4035 Maze
Maze http://acm.hdu.edu.cn/showproblem.php?pid=4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率 ...
- hdu 1520 树形dp
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 #include<cstdio> #include<cstring> # ...
- HDU 2836 (离散化DP+区间优化)
Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...
- hdu 5568(dp+大数模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5568 官方题解: #include <cstdio> #include <cstri ...
- hdu 5464(简单dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5464 解题思路: 由于p很小,而ai很大,所以先把ai%p,由于ai可能有负数,所以ai=(ai%p+ ...
最新文章
- NHIBERNATE
- Rails全局处理Error
- delphi中DateTimePicker控件同时输入日期和时间
- java定义一个盒子类box_定义一个Box(盒子)类,在该类定义中包括数据成员: length(长),width(宽)和height(...
- winScp中文乱码设置
- 熊猫多模式站群 模型handlers流程图
- 诗与远方:无题(四十)
- 学霸机器人“拼”高考 将成国内人工智能里程碑
- 使用Xmanger登陆aix系统桌面时报桌面服务DT未启动问题
- B/S---控件属性
- Spring.net 控制反转(IoC)容器_(收集)
- wbs简单介绍以及相关模板截图
- CS 61A Spring 2019 HW02 学习笔记
- 澳门大学计算机qs排名,澳门大学世界QS排名
- SQL SERVER SSMS查询分析器窗口关掉后没有保存的SQL找回-图文说明
- Internet Explorer无法打开Internet 站点的原因
- 7、杂项:蓝牙beacon简述
- 技术问答-1 跨平台
- STM32CubeMX生成工程失败
- SQLmap在进行SQL注入时的整个流程