HDU4035 Maze 【树形DP】【期望DP】

题目分析:

以前一直不会这个方法, 我好菜啊。

转移分为三个部分,一个是直接成功,一个是转移到E1,还有一个是转移到自己周围的一圈儿点。 如果是叶子那么只能转移到父亲,如果不是叶子可以把非叶子的转移代换,这样也只转移到父亲,判一下无解就行了。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 10200;
 5 const double eps = 1e-10;
 6
 7 int n,Tmp,cas;
 8 double a[maxn],b[maxn];
 9 vector<int> g[maxn];
10
11 double A[maxn],B[maxn],C[maxn];
12
13 void dfs(int now,int f){
14     int cnt = 0;
15     for(int i=0;i<g[now].size();i++){
16     if(g[now][i] == f) continue;
17     cnt++; dfs(g[now][i],now);
18     }
19     if(cnt == 0){A[now] = a[now]; B[now] = 1-a[now]-b[now]; C[now] = B[now];}
20     else{
21     double alpha = 0,beta = 0,gamma = 0;
22     for(int i=0;i<g[now].size();i++){
23         if(g[now][i] == f) continue;
24         alpha += A[g[now][i]];beta += B[g[now][i]];gamma += C[g[now][i]];
25     }
26     if(f != 0){
27         gamma += cnt+1;
28         alpha *= (1-a[now]-b[now])/(cnt+1);
29         beta *= (1-a[now]-b[now])/(cnt+1);
30         gamma *= (1-a[now]-b[now])/(cnt+1);
31         B[now] = (1-a[now]-b[now])/(cnt+1);
32         beta = 1-beta; C[now] = gamma; A[now] = alpha+a[now];
33         C[now] /= beta; A[now] /= beta; B[now] /= beta;
34     }else{
35         gamma += cnt;
36         alpha *= (1-a[now]-b[now])/cnt;
37         beta *= (1-a[now]-b[now])/cnt;
38         gamma *= (1-a[now]-b[now])/cnt;
39         B[now] = 0; C[now] = gamma; beta = 1-(alpha+beta+a[now]);
40         if(beta <= eps){C[now] = -1;}
41         else C[now] /= beta;
42     }
43     }
44 }
45
46 void read(){
47     scanf("%d",&n);
48     memset(A,0,sizeof(A));
49     memset(B,0,sizeof(B));
50     memset(C,0,sizeof(C));
51     memset(a,0,sizeof(a));
52     memset(b,0,sizeof(b));
53     for(int i=1;i<=n;i++) g[i].clear();
54     for(int i=1;i<n;i++){
55     int u,v; scanf("%d%d",&u,&v);
56     g[u].push_back(v); g[v].push_back(u);
57     }
58     for(int i=1;i<=n;i++) {
59     int u,v; scanf("%d%d",&u,&v);
60     a[i] = u/100.0,b[i] = v/100.0;
61     }
62 }
63
64 void work(){
65     dfs(1,0);
66     printf("Case %d: ",cas);
67     if(C[1] == -1){puts("impossible");}
68     else{printf("%.6lf\n",C[1]);}
69 }
70
71 int main(){
72     scanf("%d",&Tmp);
73     while(cas++,Tmp--){
74     read();
75     work();
76     }
77     return 0;
78 }

原文地址:https://www.cnblogs.com/Menhera/p/9545954.html

时间: 2024-11-08 20:31:51

HDU4035 Maze 【树形DP】【期望DP】的相关文章

Atcoder Beginner Contest 144 F- Fork the Road(概率DP/期望DP)

Problem Statement There is a cave consisting of NN rooms and MM one-directional passages. The rooms are numbered 11 through NN . Takahashi is now in Room 11 , and Room NN has the exit. The ii -th passage connects Room sisi and Room titi (sisi < titi

CF482C Game with Strings (状压DP+期望DP)

题目大意:甲和乙玩游戏,甲给出n(n<=50)个等长的字符串(len<=20),然后甲选出其中一个字符串,乙随机询问该字符串某一位的字符(不会重复询问一个位置),求乙能确定该串是哪个字符串的询问次数的期望值 这题不看题解好难想......(感谢zhx和zhx两位大佬的题解) len很小,考虑状压DP,显然我们要状压询问,要定义两个状态,f[]和num[] 1表示询问,0表示未询问 那么,我们定义f[s]表示询问状态s距离确定一个字符串所需要的期望值. 定义tot是s状态剩余的询问的次数,那么显

hdu 4035 Maze(比较经典的树形期望DP)

Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 1677    Accepted Submission(s): 638 Special Judge Problem Description When wake up, lxhgww find himself in a huge maze. The maze consisted b

BZOJ 2878([Noi2012]迷失游乐园-树形DP+环加外向树+期望DP+vector的erase)

2878: [Noi2012]迷失游乐园 Time Limit: 10 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 319  Solved: 223 [Submit][Status] Description 放假了,小Z觉得呆在家里特别无聊,于是决定一个人去游乐园玩.进入游乐园后,小Z看了看游乐园的地图,发现可以将游乐园抽象成有n个景点.m条道路的无向连通图,且该图中至多有一个环(即m只可能等于n或者n-1).小Z现在所在的大门也正好是

BZOJ 2878 [Noi2012]迷失游乐园 树形期望DP+基环树

题意:链接 方法:树形期望DP+基环树 解析: 首先先看前50%的数据 是一棵树 那么我们可以搞树形DP 然后设几个正常的数组 sum[i]代表i走i的子节点的期望的和. down[i]代表从底下走到i的期望. size[i]代表i的儿子个数 up[i]代表从i往上走的期望 然后就可以推式子了 显而易见地可以推出来up的式子 然后有一些奇怪的关于根节点的特判,注意一下就OK了. 然后后50% 我们发现它是一个基环树? 那么首先可以乱搞出来环上的点,然后记录一下这个环上的点的连接方式,求一下相邻两

hdu4035之经典慨率DP

Maze Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 1419    Accepted Submission(s): 511 Special Judge Problem Description When wake up, lxhgww find himself in a huge maze. The maze consisted b

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

HDOJ 1145 So you want to be a 2n-aire? 期望DP

期望DP So you want to be a 2n-aire? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 267    Accepted Submission(s): 197 Problem Description The player starts with a prize of $1, and is asked a seq

ZOJ 3329 期望DP

题目大意: 给定3个已经规定好k1,k2,k3面的3个色子,如果扔到a,b,c则重新开始从1 计数,否则不断叠加所有面的数字之和,直到超过n,输出丢的次数的数学期望 我们在此令dp[]数组记录从当前数值到结束的数学期望 假如有3个面数都为2的色子 那么dp[i] = 1.0 / 2/2/2 * dp[0] + 1.0/8*dp[i+3] +3.0/8*dp[i+4]+3.0/8*dp[i+5]+1.0/8*dp[i+6] + 1 当然那些下标大于i的dp值均为0 可是我们这样从后往前推会导致无法

HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由于得到每张卡片的状态不知道,所以用状态压缩,dp[i] 表示这个状态时,要全部收齐卡片的期望. 由于有可能是什么也没有,所以我们要特殊判断一下.然后就和剩下的就简单了. 另一个方法就是状态压缩+容斥,同样每个状态表示收集的状态,由于每张卡都是独立,所以,每个卡片的期望就是1.0/p,然后要做的就是要去重,既然