caioj1275&&hdu4035: 概率期望值6:迷宫
期望的大难题,%%ZZZ大佬的解释,不得不说这是一道好题(然而膜题解都没完全看懂,然后就去烦ZZZ大佬)
简单补充几句吧,tmp的理解是个难点,除以tmp的原因是,当我们化简时,子节点也有一个B*f[父节点],这个时候我们化简不掉,怎么办?直接将他放到等式的左边,和f[父节点]合起来,(1-(1-ki-ei)/m*∑(Bj)),这里1就是原来的父节点,然后(1-ki-ei)/m是到这个子节点的概率,乘以Bj。
这是一道树形dp,核心思想是列出dp方程用逆推的方法往前求,将这道图论题转化为数学模型化简
首先这个图有n个点,n-1条边,且两点之间仅有一条边,那么这个图实际上就是一棵树
对于点i:
设f(i)表示在结点i处,要走出迷宫所要走的边数的期望。f(1)即为所求。若点i是叶子节点,则:
f(i)=ki*f(1)+ei*0+(1-ki-ei)*(f(fa)+1)
f(i)=ki*f(1)+(1-ki-ei)*f(fa)+(1-ki-ei) 叶子式若点i非叶子节点,则他有父亲节点fa,和若干个儿子节点son:
f(i)=ki*f(1)+ei*0+(1-ki-ei)/m *(f(fa)+1) + (1-ki-ei)/m * ∑(f(son)+1)
f(i)=ki*f(1)+(1-ki-ei)/m *f(fa)+(1-ki-ei)/m*∑(f(son))+(1-ki-ei); 非叶子式
(∑符号是求和的意思,也就是把所有的孩子加起来)从公式可知求f(i)需要求到f(fa),f(son)
但这是很难求到的,因为要一直往上求,直到f(1),我们要求f(1)来着假设非叶子节点i是j的父亲
设 tmp*f(i)=Ai*f(1)+Bi*f(fa)+Ci; 我们把这个作为基本式 ,tmp是我们要除掉的系数,先不管他在非叶子节点中:
设
f(son) = Aj*f(1)+Bj*f(i)+Cj;
∑(f(son))=∑(Aj*f(1)+Bj*f(i)+Cj);代入非叶子式得
f(i)=ki*f(1)+(1-ki-ei)/m *f(fa)+(1-ki-ei)/m*∑(Aj*f(1)+Bj*f(i)+Cj)+(1-ki-ei);
化为基本式的形式得:
(1-(1-ki-ei)/m*∑(Bj))*f(i)=(ki+(1-ki-ei)/m*∑(Aj))*f(1)+(1-ki-ei)/m *f(fa)+(1-ki-ei+(1-ki-ei)/m*∑(cj));代入基本式得:
tmp= (1-(1-ki-ei)/m*∑(Bj))
Ai=(ki+(1-ki-ei)/m*∑(Aj))/tmp
Bi=(1-ki-ei)/m/tmp
Ci=(1-ki-ei+(1-ki-ei)/m*∑(cj))/tmp观察到 Ai,Bi,Ci 只与j有关的Aj,Bj,Cj 和 与i有关的ki,ei 有关
所以从可以叶子开始逆推得到A1,B1,C1在叶子节点中 易得:
Ai=ki;
Bi=(1-ki-ei);
Ci=(1-ki-ei);而f(1)=A1*f(1)+B1*0+C1;//1的父亲是0
f(1)=C1/(1-A1);
若A1趋近于1则无解
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const double eps=1e-;
struct node
{
int x,y,next;
}a[];int last[],len;
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
double k[],e[];
double A[],B[],C[];
int tot[];
bool dfs(int x,int fa)
{
A[x]=k[x];
B[x]=(-k[x]-e[x])/tot[x];
C[x]=-k[x]-e[x]; double tmp=;
for(int i=last[x];i;i=a[i].next)
{
int y=a[i].y;
if(y!=fa)
{
if(dfs(y,x)==false)return false; A[x]+=(-k[x]-e[x])/tot[x] *A[y];
C[x]+=(-k[x]-e[x])/tot[x] *C[y];
tmp +=(-k[x]-e[x])/tot[x] *B[y];
}
}
if(fabs(tmp-)<eps)return false;
A[x]/=(-tmp);
B[x]/=(-tmp);
C[x]/=(-tmp);
return true;
}
int main()
{
int T;
scanf("%d",&T);
for(int tt=;tt<=T;tt++)
{
int n,x,y;
scanf("%d",&n);
len=;memset(last,,sizeof(last));
memset(tot,,sizeof(tot));
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);
tot[x]++;tot[y]++;
}
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&k[i],&e[i]);
k[i]/=;e[i]/=;
} if(dfs(,)==true&&fabs(-A[])>eps)
printf("Case %d: %.6lf\n",tt,C[]/(-A[]));
else
printf("Case %d: impossible\n",tt);
}
return ;
}
caioj1275&&hdu4035: 概率期望值6:迷宫的更多相关文章
- caioj1270: 概率期望值1:小象涂色
DP深似海,得其得天下.——题记 叕叕叕叕叕叕叕叕叕叕叕(第∞次学DP内容)被D飞了,真的被DP(pa)了.这次D我的是大叫着第二题比较难(小象涂色傻b题)的Mocha(zzz)大佬,表示搞个概率DP ...
- caioj1272&&codeforces 148D: 概率期望值3:抓老鼠
这道真的是好题,不卡精度,不卡细节,但是思考的方式很巧妙! 一开始大家跟我想的应该差不多,用f[i][j]表示有i只白老鼠,j只黑老鼠的胜率,然后跑DP,然后我就发现,这样怎么做?还有一种不胜不负的平 ...
- caioj1271&&poj3071: 概率期望值2:足球
见到网上的大佬们都用了位运算..表示看不懂就自己想了,还挺好想的(然而我不会告诉你我因为p的数组问题卡了半小时顺便D了ZZZ大佬的数据) DP方程(伪)就是:第t轮第i个队晋级的可能=第t-1轮第i个 ...
- [转]机器学习——C4.5 决策树算法学习
1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法.它是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分 ...
- hdu 4035 Maze(期待更多经典的树DP)
Maze Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Submi ...
- 决策树的剪枝,分类回归树CART
决策树的剪枝 决策树为什么要剪枝?原因就是避免决策树“过拟合”样本.前面的算法生成的决策树非常的详细而庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的.因此用这个决策树来 ...
- [HDU4035] Maze(概率DP)
HDU4035 有\(n\)个房间 , 由\(n-1\)条隧道连通起来 , 实际上就形成了一棵树 , 从结点\(1\)出发 , 开始走 , 在每个结点\(i\)都有\(3\)种可能 : \(1.\)被 ...
- HDU-4035 Maze (概率DP求期望)
题目大意:在一个树形迷宫中,以房间为节点.有n间房间,每间房间存在陷阱的概率为ki,存在出口的概率为ei,如果这两种情况都不存在(概率为pi),那么只能做出选择走向下一个房间(包括可能会走向上一个房间 ...
- hdu4035(概率dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结 ...
随机推荐
- 项目如何发布到tomcat
在eclipse上export 出WAR file 然后将文件放到tomcat中的webapps 上即可.
- virtualbox创建虚机后配置网络上网
一般来说常用的会配置两个网卡:(两个网卡应该在安装虚拟机之前就设置好) 1.NAT网络: 用于上外网: 2.host-only: 用于ssh连接,可以被其他人远程访问. 前提: 如图:在virtual ...
- Java学习之接口概念
Java语言只支持单重继承,不支持多继承,即一个类只能有一个父类.但是在实际应用中,又经常需要使用多继承来解决问题.为了解决该问题,Java语言提供接口来实现类的多继承问题. 接口(英文interfa ...
- Google JavaScript代码风格指南
Google JavaScript代码风格指南 修正版本 2.28 Aaron Whyte Bob Jervis Dan Pupius Eric Arvidsson Fritz Schneider R ...
- NYOJ595乱七八糟好坑的水题~~
乱七八糟 时间限制:1000 ms | 内存限制:65535 KB 难度:1 描述 一天,PIAOYI查看班级成绩时发现各种乱七八糟的数据,有点晕--但是他现在非常想知道排名情况,你能帮帮他吗?为 ...
- [Kubernetes]Volume
容器技术使用rootfs机制和Mount Namespace,构建出一个同宿主机完全隔离开的文件系统环境 那容器里进程新建的文件,怎么样才能让宿主机获取到?宿主机上的文件和目录,怎么样才能让容器里的进 ...
- VMware搭建Oracle 11g RAC测试环境 For Linux
环境如下: Linux操作系统:Centos 6.5 64bit (这个版本的redhat 6内核等OS在安装grid最后执行root.sh时会出现crs-4124,是oracle11.2.0.1的b ...
- [codevs2495]水叮当的舞步
[codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...
- [POJ2352] Stars(树状数组)
传送门 先按照下标x排序,然后依次把y加入树状数组,边加入边统计即可. 注意下标re从零开始,需+1s ——代码 # include <iostream> # include <cs ...
- mysql与时间有关的查询
date(str)函数可以返回str中形如"1997-05-26"格式的日期,str要是合法的日期的表达式,如2008-08-08 22:20:46 时间是可以比较大小的,例如: ...