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 成都网络游戏相关推荐

  1. poj 2096 , zoj 3329 , hdu 4035 —— 期望DP

    题目:http://poj.org/problem?id=2096 题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种: 所以设 f[i][j] 表示已经有几种 ...

  2. HDU - 4734 F(x) (2013成都网络游戏,数字DP)

    意甲冠军:求0-B见面<=F[A]所有可能的 思维:数字DP,内存搜索 #include <iostream> #include <cstring> #include & ...

  3. HDU 4035 Maze(树形概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...

  4. HDU - 4035 Maze(概率dp)

    题目链接:点击查看 题目大意:给出一个 n 个点的树,初始时位于点 1 ,每个点都会给出一个概率 k[ i ] 和一个概率 e[ i ] ,其代表的意义分别是: k[ i ] :在点 i 有 k[ i ...

  5. HDU 4035 Maze

    Maze http://acm.hdu.edu.cn/showproblem.php?pid=4035 分析: 在树上走来走去,然后在一个点可以k的概率回到1,可以e的概率走出去,可以1-k-e的概率 ...

  6. hdu 1520 树形dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 #include<cstdio> #include<cstring> # ...

  7. HDU 2836 (离散化DP+区间优化)

    Reference:http://www.cnblogs.com/wuyiqi/archive/2012/03/28/2420916.html 题目链接: http://acm.hdu.edu.cn/ ...

  8. hdu 5568(dp+大数模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5568 官方题解: #include <cstdio> #include <cstri ...

  9. hdu 5464(简单dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5464 解题思路: 由于p很小,而ai很大,所以先把ai%p,由于ai可能有负数,所以ai=(ai%p+ ...

最新文章

  1. NHIBERNATE
  2. Rails全局处理Error
  3. delphi中DateTimePicker控件同时输入日期和时间
  4. java定义一个盒子类box_定义一个Box(盒子)类,在该类定义中包括数据成员: length(长),width(宽)和height(...
  5. winScp中文乱码设置
  6. 熊猫多模式站群 模型handlers流程图
  7. 诗与远方:无题(四十)
  8. 学霸机器人“拼”高考 将成国内人工智能里程碑
  9. 使用Xmanger登陆aix系统桌面时报桌面服务DT未启动问题
  10. B/S---控件属性
  11. Spring.net 控制反转(IoC)容器_(收集)
  12. wbs简单介绍以及相关模板截图
  13. CS 61A Spring 2019 HW02 学习笔记
  14. 澳门大学计算机qs排名,澳门大学世界QS排名
  15. SQL SERVER SSMS查询分析器窗口关掉后没有保存的SQL找回-图文说明
  16. Internet Explorer无法打开Internet 站点的原因
  17. 7、杂项:蓝牙beacon简述
  18. 技术问答-1 跨平台
  19. STM32CubeMX生成工程失败
  20. SQLmap在进行SQL注入时的整个流程

热门文章

  1. 读《大道至简——失败的过程也是过程》有感
  2. hdu4763 KMP
  3. cf 11A Increasing Sequence(水,)
  4. C# 集合类(四):Hashtable
  5. Python(17)_urllib下的parse的编码解码函数
  6. DescriptionAttribute Class
  7. Windows 10 开发环境搭建
  8. 分布式系统用户登录路由
  9. [计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程
  10. centos6.5编译安装php7