感觉期望DP这种东西像是玄学…

主要总结说一点基础性的东西, 或许对于理解题目的做法会有一点帮助.

首先是关于独立事件, 互斥事件的概念. 通俗地说, 就是对于两个事件A, B, 假如满足发生了其中一个就不会发生另一个, 则称A, B为互斥事件; 假如A与B的发生没有任何关系, 可能都发生, 可能只有一个发生, 也可能都不发生, 则称A, B为独立事件. 下文的讨论主要针对独立事件进行.

一. 事件间的关系与运算;

A + B (和事件): 表示A, B两个事件至少有一个发生;

A · B(积事件)表示A, B两个事件同时发生;

二. 复杂事件的概率运算公式

和事件的概率: P(A + B) = P(A) + P(B) - P(A * B)

推广得到: P(A)=(P(A+B)−P(B))/(1−P(B))

即: P(A - B) = (P(A) - P(B)) / (1 - P(B))

适用于在知道和事件与其中一个事件的概率的情况下, 求另一个事件的概率.

特别地, 当A与B为互斥事件时, P(A + B) = P(A) + P(B)

积事件的概率: P(A1 * A2 * A3 * … * An) = P(A1) * P(A2) * … * P(An)

三. 期望值的计算公式:

Ex = ΣXiPi(ΣPi = 1)

例题: BZOJ3566概率充电器

这一题就用到了和公式与差公式

#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
inline int read()
{
int x = 0, flag = 1;
char c;
while(! isgraph(c = getchar()))
if(c == '-')
flag *= - 1;
while(isgraph(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
}
void println(int x)
{
if(x < 0)
putchar('-'), x *= - 1;
if(x == 0)
putchar('0');
int top = 0, ans[1 << 4];
while(x)
ans[top ++] = x % 10, x /= 10;
for(; top; top --)
putchar(ans[top - 1] + '0');
putchar('\n');
}
const double EPS = 1e-8;
const int MAXN = 1 << 20;
int head[MAXN];
int top;
struct edge
{
int v, next;
double p;
}T[MAXN << 1];
void add_edge(int u, int v, double p)
{
T[top].v = v, T[top].next = head[u], T[top].p = p, head[u] = top ++;
}
double q[MAXN];
double f[MAXN], ans[MAXN];
void DFS(int u, int fa)
{
f[u] = q[u];
for(int i = head[u]; i != - 1; i = T[i].next)
{
int v = T[i].v;
if(v == fa)
continue;
DFS(v, u);
f[u] = f[u] + f[v] * T[i].p - f[u] * f[v] * T[i].p;
}
}
void DGS(int u, int fa)
{
for(int i = head[u]; i != - 1; i = T[i].next)
{
int v = T[i].v;
if(v == fa)
continue;
if(1 - f[v] * T[i].p < EPS)
ans[v] = 1.0;
else
{
double x = (ans[u] - f[v] * T[i].p) / (1 - f[v] * T[i].p) * T[i].p;
ans[v] = f[v] + x - f[v] * x;
}
DGS(v, u);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("BZOJ3566.in", "r", stdin);
freopen("BZOJ3566.out", "w", stdout);
#endif
int n = read();
memset(head, - 1, sizeof(head));
top = 0;
for(int i = 1; i < n; i ++)
{
int a = read(), b = read(), p = read();
add_edge(a, b, (double)p / 100.0);
add_edge(b, a, (double)p / 100.0);
}
for(int i = 1; i <= n; i ++)
q[i] = (double)read() / 100.0;
memset(f, 0, sizeof(f));
DFS(1, 1);
ans[1] = f[1];
DGS(1, 1);
double sum = 0;;
for(int i = 1; i <= n; i ++)
sum += ans[i];
printf("%.6f", sum);
}


期望DP初步的更多相关文章

  1. 概率/期望DP初步——BZOJ1415 聪聪和可可

    期望相关: 数学期望,可以简单理解的加权平均数.设有一系列的值$x_i$,每个值被取到的概率为$p_i$,则期望$E=\sum\limits_{i=1}^n p_i x_i$. 期望具有线性性:$$E ...

  2. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  3. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

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

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  5. 【BZOJ-4008】亚瑟王 概率与期望 + DP

    4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 832  Solved: 5 ...

  6. 期望dp BZOJ3450+BZOJ4318

    BZOJ3450 概率期望DP f[i]表示到i的期望得分,g[i]表示到i的期望长度. 分三种情况转移: ① s[i]=‘x’:f[i]=f[i-1],g[i]=0 ② s[i]=‘o’:f[i]= ...

  7. HDU 4405 期望DP

    期望DP算是第一题吧...虽然巨水但把思路理理清楚总是好的.. 题意:在一个1×n的格子上掷色子,从0点出发,掷了多少前进几步,同时有些格点直接相连,即若a,b相连,当落到a点时直接飞向b点.求走到n ...

  8. POJ 2096 【期望DP】

    题意: 有n种选择,每种选择对应m种状态.每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等. 求n种选择和m种状态中每种至少发生一次的期望. 期望DP好别扭啊.要用倒推的方法. dp[i ...

  9. ZOJ 3822 Domination 期望dp

    Domination Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...

随机推荐

  1. HDU 4871 Shortest-path tree 最短路 + 树分治

    题意: 输入一个带权的无向连通图 定义以顶点\(u\)为根的最短路生成树为: 树上任何点\(v\)到\(u\)的距离都是原图最短的,如果有多条最短路,取字典序最小的那条. 然后询问生成树上恰好包含\( ...

  2. [转] vuex最简单、最直白、最全的入门文档

    前言 我们经常用element-ui做后台管理系统,经常会遇到父组件给子组件传递数据,下面一个简单的例子,点击按钮,把弹框显示变量数据通过子组件的props属性传递,子组件通过$emit事件监听把数据 ...

  3. uiautomatorviewer打不开

    uiautomatorviewer打不开: 因为之前我下载的jdk版本为10,后来将jdk版本改为8之后就可以打开了.

  4. AtCoder Regular Contest 083

    C - Sugar Water Time limit : 3sec / Memory limit : 256MB Score : 300 points Problem Statement Snuke ...

  5. Set容器——TreeSet及常用API

    TreeSet及常用Api ①   TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储,访问和检索很快; ②   在存储了大量的需要进行快速检索的排序信息的情况下,TreeSe ...

  6. [LOJ#516]「LibreOJ β Round #2」DP 一般看规律

    [LOJ#516]「LibreOJ β Round #2」DP 一般看规律 试题描述 给定一个长度为 \(n\) 的序列 \(a\),一共有 \(m\) 个操作. 每次操作的内容为:给定 \(x,y\ ...

  7. ubuntu14.04 安装 tensorflow9.0

    ubuntu14.04 安装 tensorflow9.0 文章目录 ubuntu14.04 安装 tensorflow9.0 安装pip(笔者的版本为9.0) 仅使用 CPU 的版本的tensorfl ...

  8. BZOJ2653 middle 【二分 + 主席树】

    题目 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在[c ...

  9. 【BJOI2014/bzoj4530】大融合

    题意 有 $n$ 个点,初始没有连边,要求支持两个动态操作: 1. 加一条边(保证之前两点不连通) 2. 查询过一条边的简单路径数量(就是两边连通块的大小的乘积) $n,Q\le 100000$ 题解 ...

  10. Bzoj2038 小Z的袜子(hose)

    Time Limit: 20000MS   Memory Limit: 265216KB   64bit IO Format: %lld & %llu Description 作为一个生活散漫 ...