题目描述

$n$ 张牌,$r$ 轮游戏,每轮从左向右操作,遇到第 $i$ 张牌有 $p_i$ 的概率选中,选中会产生 $d_i$ 的贡献,丢弃掉该牌并结束这一轮,否则继续下一张。问最终的期望贡献。

输入

输入文件的第一行包含一个整数 T,代表测试数据组数。

接下来一共 T 组数据。 
每组数据的第一行包含两个用空格分开的整数 n 和 r ,分别代表卡牌的张数和游戏的轮数。 
接下来 n 行,每行包含一个实数和一个整数,由空格隔开,描述一张卡牌。第 i 行的两个数为 pi 和 di ,分别代表第 i 张卡牌技能发动的概率(实数)和技能发动造成的伤害(整数)。保证 pi 最多包含 4 位小数,且为一个合法的概率。 

输出

对于每组数据,输出一行,包含一个实数,为这套卡牌在这一局游戏中造成的伤害的期望值。对于每一行输出,只有当你的输出和标准答案的相对误差不超过10^-8时——即|a-o|/a<=10-8时(其中a是标准答案,o是输出),你的输出才会被判为正确。

建议输出10 位小数。 

样例输入

1
3 2
0.5000 2
0.3000 3
0.9000 1

样例输出

3.2660250000


题解

概率dp

这种神题像我这种傻逼大概一辈子也想不出来。。。

考虑将这 $r$ 次操作一起进行,设 $f[i][j]$ 表示前 $i$ 个人,还剩 $j$ 次选择机会的概率。

考虑 $f[i][j]$ 的转移:

如果 $i$ 没有被选择,则 $j$ 次机会都不能选中,$f[i][j]=f[i-1][j]·(1-p[i])^j$ ;

如果 $i$ 有被选择,则 $j+1$ 次机会不能都不选中, $f[i][j]=f[i-1][j+1]·(1-(1-p[i])^{j+1})$ 。

因此总的状态转移方程就是 $f[i][j]=f[i-1][j]·(1-p[i])^j+f[i-1][j+1]·(1-(1-p[i])^{j+1})$ 。

得到所有的 $f$ 之后即可统计答案。对于第 $i$ 张牌,它被选中的概率是 $\sum\limits_{j=0}^mf[i-1][j]·(1-(1-p[i])^j)$ ,再乘上 $d[i]$ 即为贡献。

时间复杂度 $O(Tnr)$

#include <cmath>
#include <cstdio>
double f[230][140] , p[230] , d[230];
int main()
{
int T;
scanf("%d" , &T);
while(T -- )
{
int n , m , i , j;
double ans = 0;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ ) scanf("%lf%lf" , &p[i] , &d[i]);
f[0][m] = 1;
for(i = 1 ; i <= n ; i ++ )
for(j = 0 ; j <= m ; j ++ )
f[i][j] = f[i - 1][j] * pow(1 - p[i] , j) + f[i - 1][j + 1] * (1 - pow(1 - p[i] , j + 1));
for(i = 1 ; i <= n ; i ++ )
for(j = 0 ; j <= m ; j ++ )
ans += d[i] * f[i - 1][j] * (1 - pow(1 - p[i] , j));
f[0][m] = 0;
printf("%.10lf\n" , ans);
}
return 0;
}

【bzoj4008】[HNOI2015]亚瑟王 概率dp的更多相关文章

  1. BZOJ4008: [HNOI2015]亚瑟王(期望dp)

    Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 1952  Solved: 1159[Submit][Status] ...

  2. P3239 [HNOI2015]亚瑟王——概率DP

    题面:亚瑟王 最近考试考期望很自闭啊,没做过这种类型的题,只能现在练一练: 所谓期望,就是状态乘上自己的概率:对于这道题来说,我们要求的是每张牌的伤害乘上打出的概率的和: 当然不是直接乘,因为给的是每 ...

  3. 概率DP——BZOJ4008 [HNOI2015]亚瑟王

    [HNOI2015]亚瑟王 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂 ...

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

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

  5. BZOJ4008:[HNOI2015]亚瑟王(DP,概率期望)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个 ...

  6. 2018.10.13 bzoj4008: [HNOI2015]亚瑟王(概率dp)

    传送门 马上2点考初赛了,心里有点小紧张. 做道概率dp压压惊吧. 话说这题最开始想错了. 最开始的方法是考虑f[i][j]f[i][j]f[i][j]表示第iii轮出牌为jjj的概率. 然后用第ii ...

  7. Bzoj4008 [HNOI2015]亚瑟王

    Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special Judge Submit: 1009  Solved: 605[Submit][Status] ...

  8. P3239 [HNOI2015]亚瑟王 期望dp

    这个题一看就是期望dp,但是我有个问题,一个事件的期望等于他所有事件可能行乘权值的和吗...为什么我有天考试的时候就不对呢...求大佬解释一下. 至于这道题,f[i][j]代表前i个有j个发动技能,这 ...

  9. P3239 [HNOI2015]亚瑟王 期望 dp

    LINK:亚瑟王 Saber!Excalibur! 比较难的期望dp. 可以发现如果暴力枚举所有的局面复杂度很高 . 转换的思路则是 期望的线性性. 求出每张牌的期望累加即可. 考虑每张牌的期望=这张 ...

随机推荐

  1. PHP.47-TP框架商城应用实例-后台22-权限管理-角色和管理员的关系

    角色和管理员的关系 角色功能 管理员功能 角色与管理的关联要通过管理-角色表进行{多对多} /********* 管理-角色表 *********/ drop if exists p39_admin_ ...

  2. 下载地图瓦片(包括各种格式的,Openstreetmap,googlemap, bingmap)

    参考第三方开源库Brutile 个人的程序托管在github上

  3. BZOJ4300_绝世好题_KEY

    题目传送门 刚开始是看到这道题目还以为是序列连续的. 当然了,序列可以不连续. 设f[i]表示到第i位时的序列的最长长度. 取cnt=Max f[j]+1,然后转移回去使f[j]=cnt. 这是为了让 ...

  4. Qt 学习之路 2

    Qt 学习之路 2 | DevBean Tech World Qt 学习之路 2 Qt 学习之路 2 目录

  5. springboot之websocket

    一.WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端. 二.长久以来, 创建实现客户端和用户端之间双工 ...

  6. MySql 增加字段 删除字段 修改字段名称 修改字段类型

    //1.增加一个字段 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段,默认为空 alter table user ...

  7. atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?

    atomic不是绝对的线程安全.atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的 @property (atomic, assign) int intA; //线程A f ...

  8. C# 浮点转时间

    想了大半天实在想不出什么更适合文章的标题... 就现在这个标题,挺好- - 什么是浮点转时间呢? 今天写的一个计时功能,想来想去还是现在这种解决方案比较合适 先上一张图在来讲解比较明了 如图:赛车游戏 ...

  9. MySQL日期、字符串、时间戳互转

    平时比较常用的时间.字符串.时间戳之间的互相转换,虽然常用但是几乎每次使用时候都喜欢去搜索一下用法:本文将作为一个笔记,整理一下三者之间的 转换(即:date转字符串.date转时间戳.字符串转dat ...

  10. Qt-QML-QML调用C++类

    QML用来做界面,在不考虑数据的请款下,那是溜溜的,但是,程序是没有不和后台数据交互的,但是了,QML在数据处理方面的效率又是不敢恭维的,这里就出现了QML负责前端界面,而后端使用JS或者C++了. ...