题意

dragon和princess玩一个游戏。开始的时候袋子里有w个白老鼠和b个黑老鼠。两个人轮流从袋子里面往外摸老鼠。谁先拿到白老鼠谁先获胜。dragon每次抓出一只老鼠,剩下老鼠里面都会有一只跳出袋子。princess则不会。 princess先抓。问princess赢得概率是多少。

分析

简单的概率DP。我一看到两个人玩得这种游戏就习惯性的定义两个dp数组。

f[i][j][0]为当前袋子里有i只白老鼠,j只黑老鼠时,princess赢得概率

f[i][j][1]为当前袋子里有i只白老鼠,j只黑老鼠时,dragon赢得概率

状态的转移也很好想

f[i][j][0]=(1-f[i][j-1][1])*(j/(i+j))+i/(i+j).

f[i][j][1]=(1-f[i-1][j-1][0])*j/(i+j)*i/(i+j-1)+(1-f[i][j-2][0])j/(i+j)(j-1)/(i+j-1)+i/(i+j)

AC代码如下

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std;
const int maxn=+;
int w,b;
double f[maxn][maxn][]; int main(){
scanf("%d%d",&w,&b);
memset(f,,sizeof(f));
f[][][]=;f[][][]=1.0;
for(int i=;i<=w;i++)
f[i][][]=f[i][][]=1.0;
for(int i=;i<=b;i++)
f[][i][]=1.0;
for(int i=;i<=w;i++){
for(int j=;j<=b;j++){
if(j==||i==)
continue;
if(j>=){
f[i][j][]=(-f[i][j-][])*j/(i+j)+(double)i/(i+j);
if(i>=)
f[i][j][]=(-f[i-][j-][])*(j*i)/((i+j)*(i+j-))+(double)i/(i+j);
}
if(j>=)
f[i][j][]+=(-f[i][j-][])*(j*(j-))/((i+j)*(i+j-));
}
}
printf("%.9f",f[w][b][]); return ;
}

然后我看网上大佬们一般一个数组就解决了。

令f[i][j]为当前有i个白老鼠,j个黑老鼠时,princess先手,赢得概率。

那么状态转移有几种可能性:

1.princess直接拿到了白老鼠,赢得了游戏,概率为i/(i+j)

2.princess拿到了黑老鼠,dragon拿到了黑老鼠,跳出来黑老鼠,概率为j/(i+j) *  (j-1)/(i+j-1) *  (j-2)/(i+j-2)

3.princess拿到了黑老鼠,dragon拿到了黑老鼠,跳出来一只白老鼠,概率为j/(i+j) *  (j-1)/(i+j-1) *  i/(i+j-2)

AC代码如下

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream> using namespace std;
const int maxn=+;
double f[maxn][maxn];
int w,b;
int main(){
scanf("%d%d",&w,&b);
memset(f,,sizeof(f));
for(int i=;i<=w;i++)
f[i][]=1.0;
for(int i=;i<=b;i++)
f[][i]=0.0;
f[][]=;
for(int i=;i<=w;i++){
for(int j=;j<=b;j++){
f[i][j]+=(double)i/(i+j);
if(j>=){
f[i][j]+=(double)j/(i+j)*(double)(j-)/(i+j-)*(double)(j-)/(i+j-)*f[i][j-];
}
if(j>=){
f[i][j]+=(double)j/(i+j)*(double)(j-)/(i+j-)*(double)i/(i+j-)*f[i-][j-];
}
}
}
printf("%.9f\n",f[w][b]);
return ;
}

【CodeForces148D】Bag of mice的更多相关文章

  1. 【CF148D】 Bag of mice (概率DP)

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  2. 【CodeForces】【148D】Bag of mice

    概率DP kuangbin总结中的第9题 啊……题目给的数据只有白鼠和黑鼠的数量,所以我们只能在这个上面做(gao)文(D)章(P)了…… 明显可以用两种老鼠的数量来作为状态= = 我的WA做法: 令 ...

  3. 【Codeforces 105D】 Bag of mice

    [题目链接] http://codeforces.com/contest/148/problem/D [算法] 概率DP f[w][b]表示还剩w只白老鼠,b只黑老鼠,公主胜利的概率,那么 : 1. ...

  4. 【codeforces 148D】 Bag of mice

    http://codeforces.com/problemset/problem/148/D (题目链接) 题意 包中有w个白鼠,b个黑鼠.公主和龙轮流画老鼠,公主先画,谁先画到白鼠谁就赢.龙每画完一 ...

  5. 【ros】.bag文件

    Bags are typically created by a tool like rosbag They store the serialized message data in a file as ...

  6. CF 148D Bag of mice【概率DP】

    D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes Promblem descriptio ...

  7. 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks

    训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. 【转】java正则表达式

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu ...

随机推荐

  1. [LeetCode系列] 二叉树最大深度求解问题(C++递归解法)

    问: 给定二叉树, 如何计算二叉树最大深度? 算法描述如下: 如果当前节点为空, 返回0(代表此节点下方最大节点数为0) 如果当前节点不为空, 返回(其左子树和右子树下方最大节点数中的最大值+1) 上 ...

  2. C#实现 OPC历史数据存取研究

    来源:http://blog.csdn.net/gjack/article/details/5641794 C#实现 OPC历史数据存取研究 (原文)Research of Accessing the ...

  3. 打包python文件,让文件程序化

    通过对源文件打包,Python程序可以在没有安装 Python的环境中运行,也可以作为一个独立文件方便传递和管理. 现在网上主流的打包方式有两种py2exe或者pyinstaller两款多平台的Pyt ...

  4. ElasticSearch读取查询结果(search)

    本文转载自:http://blog.csdn.net/wangxiaotongfan/article/details/46531729?locationNum=6 在es中所有的查询结果都会保存在Se ...

  5. [转] geochart 地图控件官方示例

    <html> <head> <script type='text/javascript' src='https://www.google.com/jsapi'>&l ...

  6. OSPF理论介绍

    OSPF协议Open Shortest Path First是链路状态协议.RIP和EIGRP是距离矢量协议只知道邻居,但链路状态可知道全网信息,因此天然免疫环路.距离矢量协议和链路状态协议最大的区别 ...

  7. django之中间件设置

    中间件 是一个轻量级.底层的插件系统,可以介入Django的请求和响应处理过程,修改Django的输入或输出 激活:添加到Django配置文件中的MIDDLEWARE_CLASSES元组中 每个中间件 ...

  8. C# 接口(Interface)

    接口定义了所有类继承接口时应遵循的语法合同.接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分. 口定义了属性.方法和事件,这些都是接 ...

  9. Netty心跳之IdleStateHandler

    Netty提供了对心跳机制的天然支持,心跳可以检测远程端是否存活,或者活跃 今天我们就一起初识一下Netty4的心跳机制 Netty4.0提供了一个类,名为IdleStateHandler,这个类可以 ...

  10. FTP服务器(SOCKET)返回异常 500 Command not understood

    出现着这样的问题,一般是NLST中的参数包含特殊字符,如"\n",所以在发送SOCKET命令时,一定要检查命令参数的合法性.