题目:http://poj.org/problem?id=2096

题目好长...意思就是每次出现 x 和 y,问期望几次 x 集齐 n 种,y 集齐 s 种;

所以设 f[i][j] 表示已经有几种,转移一下即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double db;
int const xn=;
int n,s; db f[xn][xn];
int main()
{
scanf("%d%d",&n,&s);
for(int i=n;i>=;i--)
for(int j=s;j>=;j--)
{
if(i==n&&j==s)continue;
db p0=1.0*i/n*j/s,p1=1.0*(n-i)/n*j/s,p2=1.0*i/n*(s-j)/s,p3=1.0*(n-i)/n*(s-j)/s;
f[i][j]=p1*f[i+][j]+p2*f[i][j+]+p3*f[i+][j+]+;
f[i][j]=f[i][j]/(-p0);
}
printf("%.6f\n",f[][]);
return ;
}

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754

带环的期望DP,本来用高斯消元可以做,但 n^3 * T 过不了;

发现每个状态都有到 f[0] 的转移,所以设 f[i] = A[i] * f[0] + B[i] (套路!)

然后把递推式子代入一番,得到 A[i] 和 B[i] 的转移是无环的,求出 A[0], B[0] 即可。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double db;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int const xn=;
int n,f[xn]; db p[],A[xn],B[xn];
int main()
{
int T=rd();
while(T--)
{
n=rd(); int k1=rd(),k2=rd(),k3=rd(),a=rd(),b=rd(),c=rd(),sum=k1+k2+k3;
for(int i=;i<=sum;i++)p[i]=;
p[]=1.0/(k1*k2*k3);
for(int i=;i<=k1;i++)
for(int j=;j<=k2;j++)
for(int k=;k<=k3;k++)
if(i!=a||j!=b||k!=c)p[i+j+k]+=p[];
for(int i=;i<=n+sum;i++)A[i]=,B[i]=;
for(int i=n;i>=;i--)
{
for(int k=;k<=sum;k++)
A[i]+=p[k]*A[i+k],B[i]+=p[k]*B[i+k];
A[i]+=p[]; B[i]+=;
}
printf("%.10f\n",B[]/(-A[]));
}
return ;
}

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4035

树上带环!同样可以高斯消元,但复杂度不行;

设 \( f[x] \) 表示在 x 这个点距离结束的期望,\( P[x] = 1 - K[x] - E[x] \),\( d[x] \) 为度数,得到朴素方程:

\( f[x] = K[x] * f[1] + \frac{P[x]}{d[x]}(f[fa]+1) + \frac{P[x]}{d[x]}\sum\limits_{v \in son}(f[v]+1) \)

由于转移的顺序实际上应该是从 \( fa \) 到 \( x \),又因为每个点都和 \( 1 \) 组成环(或者因为最后要求 \( f[1] \) ?),所以设 \( f[x] = A[x]f[1] + B[x]f[fa] + C[x] \)

于是可以树形DP得到 \( A[x], B[x], C[x] \)

\( f[1] = \frac{C[1]}{1-A[1]} \),当 \( A[1] \) 趋近于 1 时无解;

eps 设成 1e-8 会 WA,1e-10 才可以。

代码如下:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define eps 1e-10
using namespace std;
typedef double db;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return f?ret:-ret;
}
int const xn=;
int n,hd[xn],ct,to[xn<<],nxt[xn<<],d[xn];
db K[xn],E[xn],P[xn],A[xn],B[xn],C[xn];
void add(int x,int y){to[++ct]=y; nxt[ct]=hd[x]; hd[x]=ct;}
void dfs(int x,int fa)
{
db as=,bs=,cs=;
for(int i=hd[x],u;i;i=nxt[i])
{
if((u=to[i])==fa)continue;
dfs(u,x);
as+=A[u]; bs+=B[u]; cs+=C[u];
}
A[x]=(d[x]*K[x]+P[x]*as)/(d[x]-P[x]*bs);
B[x]=P[x]/(d[x]-P[x]*bs);
C[x]=(P[x]*cs+d[x]*P[x])/(d[x]-P[x]*bs);
}
int main()
{
int T=rd(),cnt=;
while(T--)
{
cnt++; n=rd(); ct=; memset(hd,,sizeof hd); memset(d,,sizeof d);
for(int i=,x,y;i<n;i++)x=rd(),y=rd(),add(x,y),add(y,x),d[x]++,d[y]++;
for(int i=;i<=n;i++)
scanf("%lf%lf",&K[i],&E[i]),K[i]/=,E[i]/=,P[i]=-K[i]-E[i];
for(int i=;i<=n;i++)A[i]=B[i]=C[i]=;
dfs(,);
printf("Case %d: ",cnt);
if(fabs(A[]-)<eps)puts("impossible");
else printf("%.8f\n",C[]/(-A[]));
}
return ;
}

poj 2096 , zoj 3329 , hdu 4035 —— 期望DP的更多相关文章

  1. 【POJ 2096】Collecting Bugs 概率期望dp

    题意 有s个系统,n种bug,小明每天找出一个bug,可能是任意一个系统的,可能是任意一种bug,即是某一系统的bug概率是1/s,是某一种bug概率是1/n. 求他找到s个系统的bug,n种bug, ...

  2. HDU 4035 期望dp

    这道题站在每个位置上都会有三种状态 死亡回到起点:k[i] 找到出口结束 e[i] 原地不动 p[i] k[i]+e[i]+p[i] =1; 因为只给了n-1条路把所有都连接在一起,那么我们可以自然的 ...

  3. HDU 4405 期望DP

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

  4. poj 2096 Collecting Bugs - 概率与期望 - 动态规划

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

  5. hdu 4035 可能性DP 成都网络游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 获得: 1.首先推断是不是树.事实上,所有的感觉身影,既看边数==算-1是不成立 2.有时候,我告诉孩子来 ...

  6. HDU 3853(期望DP)

    题意: 在一个r*c的网格中行走,在每个点分别有概率向右.向下或停止不动.每一步需要的时间为2,问从左上角走到右下角的期望时间. SOL: 非常水一个DP...(先贴个代码挖个坑 code: /*== ...

  7. [zoj 3416/hdu 3709]数位DP

    题意:求从区间[L, R]内有多少个数是平衡数,平衡数是指以10进制的某一位为中心轴,左右两边的每一位到中心轴的距离乘上数位上的值的和相等.0<=L<=R<=1e18 思路:由于任何 ...

  8. poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP

    poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include< ...

  9. POJ 2096 Collecting Bugs:期望dp

    题目链接:http://poj.org/problem?id=2096 题意: 有一个程序猿,他每天都会发现一个bug. bug共有n个种类.属于某一个种类的概率为1/n. 有s个子系统,每个bug属 ...

随机推荐

  1. HTTP学习笔记02-HTTP报文格式之概述

    HTTP学习笔记02-HTTP报文格式之概述 HTTP学习笔记02-HTTP报文格式之概述 HTTP报文格式 报文的语法 起始行 首部 实体部分 学习一个协议感觉最有意思的就是看包结构…在我看来这是唯 ...

  2. 【Tech】单点登录系统CAS服务器端搭建及实现用户名密码由MYSQL数据库验证

    CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法.它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护 ...

  3. 【转载】OpenWrt sysupgrade 命令行更新固件到最新版

    OpenWrt sysupgrade 命令行更新固件到最新版 下面我们要使用 sysupgrade 更新固件到trunk最新版. 要注意的是,trunk包含试验的功能,可能不稳定,刷机风险自己承担. ...

  4. MySql 5.7 详细参数说明

    max_connections: 允许客户端并发连接的最大数量,默认值是151,一般将该参数设置为500-2000 max_connect_errors: 如果客户端尝试连接的错误数量超过这个参数设置 ...

  5. Linux下的文件查找命令——find

    Linux下几个常见的文件查找命令: which       查看可执行文件的位置 whereis    寻找特定文件,查看文件的位置 locate       配合数据库查看文件位置 find    ...

  6. Android系统--灯光系统驱动编写

    Android系统开发--Android灯光系统tiny4412_led_class驱动编写 框架分析 led_classdev_4412结构体 创建led_classdev_4412结构体 分配结构 ...

  7. 【转载】有向图强连通分量的Tarjan算法

    转载地址:https://www.byvoid.com/blog/scc-tarjan [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly conn ...

  8. Spark 属性配置

    1.Spark1.x 属性配置方式 Spark属性提供了大部分应用程序的控制项,并且可以单独为每个应用程序进行配置. 在Spark1.0.0提供了3种方式的属性配置: SparkConf方式 Spar ...

  9. nodejs 语法很特别的地方

    1. 不过我们之前说过了有 this 和没 this 的时候作用域不同,那个参数只是作用于构造函数中,而加了 this 的那个则是成员变量.用一个 this 就马上区分开来他们了,所以即使同名也没关系 ...

  10. 2017-02-20 Sql Server2016安装后无法找到Microsoft Sql Server Management Studio管理器

    最近安装的sql sever2016后发现没有Sql server management studio管理工具,无法操作sql server 解决方案,可去官网单独下载 Sql Server Mana ...