P3239 [HNOI2015]亚瑟王——概率DP
题面:亚瑟王
最近考试考期望很自闭啊,没做过这种类型的题,只能现在练一练;
所谓期望,就是状态乘上自己的概率;对于这道题来说,我们要求的是每张牌的伤害乘上打出的概率的和;
当然不是直接乘,因为给的是每轮中这张牌打出的概率,这张牌没打出就要考虑下一张牌,要有一张牌发出技能才能结束一轮;除非一张牌都发不出来;
设每张牌打出的概率是exp[],答案就是exp[i]*d[i];
exp[i]怎么求?
我们要始终在概率面前一视同仁;
因为牌只有出和不出两种状态,概率和为1;
exp[1]=1-(1-p[1])r 即为1-r轮不出的概率=r轮出的概率;
再考虑第二张:
情况一:如果第1张牌没有发动过技能,那么第22张牌发动技能的概率为1-(1−p[2])r。
情况二:如果第1张牌发动过1次技能,那么在第1张牌发动技能的那一轮,第2张牌绝对不会再发动技能了,因此第2张牌发动技能的概率为1-(1−p[2])r−1。
结合这个例子,可以得到,对于任意的i>1,在第1张牌到第i-1张牌在所有r轮内是否发动技能已经确定的情况下,
第i张牌被发动技能的概率只取决于第1张牌到第i-1张牌中有多少张发动了技能。即如果有j张发动了技能,那么在此情况下第i张牌发动技能的概率为1-(1−p[i])r−j。
(摘自洛古题解https://www.luogu.org/space/show?uid=29936)
设f[i][j]为前i张牌打出j张牌的概率,分别由f[i-1][j-1]和f[i-1][j]转移过来,这张牌打出去和这张牌没打出去;
这张牌打出去了,那么j-1轮中他扔不出去,r-j+1轮中他扔了出去,即为f[i-1][j-1]*(1-(1-p[i])r-j+1);
(1-p[i])r-j+1 是剩下的都没打出的概率,用1减去即是j轮打出的概率;
j轮打不出的概率就是f[i-1][j]*(1-(1-p[i])r-j )
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- const int maxn=;
- typedef double dd;
- int T;
- int n,r;
- dd p[maxn];
- int d[maxn];
- dd ksm_p[maxn][maxn];
- void pre_p()
- {
- for(int i=;i<=n;i++)
- {
- ksm_p[i][]=;
- for(int j=;j<=r;j++)
- {
- ksm_p[i][j]=ksm_p[i][j-]*(-p[i]);
- }
- }
- }
- dd ans;
- dd f[maxn][maxn];//i card j used
- dd exp[maxn];
- int main()
- {
- scanf("%d",&T);
- while(T--)
- {
- ans=;
- memset(f,,sizeof(f));
- memset(exp,,sizeof(exp));
- scanf("%d%d",&n,&r);
- for(int i=;i<=n;i++)
- {
- scanf("%lf%d",&p[i],&d[i]);
- }
- pre_p();
- f[][]=ksm_p[][r];
- f[][]=exp[]=1.0-ksm_p[][r];
- for(int i=;i<=n;i++)
- {
- for(int j=;j<=r;j++)
- {
- if(j>i) break;
- if(j!=i) exp[i]+=f[i-][j]*(-ksm_p[i][r-j]);
- if(j) f[i][j]+=f[i-][j-]*(-ksm_p[i][r-j+]);
- if(i!=j) f[i][j]+=f[i-][j]*ksm_p[i][r-j];
- }
- }
- for(int i=;i<=n;i++) ans+=exp[i]*d[i];
- printf("%.10lf\n",ans);
- }
- return ;
- }
P3239 [HNOI2015]亚瑟王——概率DP的更多相关文章
- P3239 [HNOI2015]亚瑟王 期望dp
这个题一看就是期望dp,但是我有个问题,一个事件的期望等于他所有事件可能行乘权值的和吗...为什么我有天考试的时候就不对呢...求大佬解释一下. 至于这道题,f[i][j]代表前i个有j个发动技能,这 ...
- P3239 [HNOI2015]亚瑟王 期望 dp
LINK:亚瑟王 Saber!Excalibur! 比较难的期望dp. 可以发现如果暴力枚举所有的局面复杂度很高 . 转换的思路则是 期望的线性性. 求出每张牌的期望累加即可. 考虑每张牌的期望=这张 ...
- 【bzoj4008】[HNOI2015]亚瑟王 概率dp
题目描述 $n$ 张牌,$r$ 轮游戏,每轮从左向右操作,遇到第 $i$ 张牌有 $p_i$ 的概率选中,选中会产生 $d_i$ 的贡献,丢弃掉该牌并结束这一轮,否则继续下一张.问最终的期望贡献. 输 ...
- 洛谷 P3239 [HNOI2015]亚瑟王(期望dp)
题面 luogu 题解 一道复杂的期望\(dp\) 思路来源:__stdcall 容易想到,只要把每张牌打出的概率算出来就可以求出\(ans\) 设\(fp[i]\)表示把第\(i\)张牌打出来的概率 ...
- [洛谷 P3239] [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...
- 洛谷P3239 [HNOI2015]亚瑟王
题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...
- BZOJ4008: [HNOI2015]亚瑟王(期望dp)
Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 1952 Solved: 1159[Submit][Status] ...
- P3239 [HNOI2015]亚瑟王
思路 神仙概率dp 由于期望的线性性质,能够想到最后要求的期望价值就是把每个卡牌发动的概率\(g_i\)乘上伤害\(val_i\)之后加到一起 然后怎么求\(g_i\)呢,肯定是要dp的 我想了例如d ...
- luoguP3239 [HNOI2015]亚瑟王 概率期望DP
当初怎么想的来着.....又忘了...... 首先,总期望 = 每张卡片的期望之和 求期望,只要我们求出每张卡片被用掉的概率即可 如果直接上状态$f[i][j]$表示在第$i$轮中,第$j$张牌发动的 ...
随机推荐
- hdu 1075 map的使用 字符串截取的常用手段 以及string getline 使用起来的注意事项
首先说字符串的截取套路吧 用坐标一个一个的输入 用遍历的方式逐个去检查字符串中的字符是否为符合的情况 如果是的话 把该字符放入截取string 中 让后坐标前移 如果不是的话 截取结束 坐标初始化 然 ...
- C# UTF-8文件带BOM和不带BOM文件的转换
读取INI文件使用的是GetPrivateProfileString方法,自己读写ini文件没有问题. 调用C++的API对同一个ini文件进行处理后,发现首个Section的值读不出来:发现是API ...
- threejs CameraHelper 查看照相机的观察范围
简单例子 这个例子,是在一个视图中,看到照相机的辅助线,也就是,一个照相机的观察访问 这样,就需要两个照相机,一个是主照相机,一个是加有辅助线的照相机(有两种,正交和透视,这里辅助的使用的是正交的) ...
- Detection综述
4月中旬开始,尝试对目标检测领域做一个了解,看了差不多6-7篇paper,在这里记录一下: 一.Detection简介 人脸检测的目标是找出图像中所有的人脸对应的位置,算法的输出是人脸外接矩形在图像中 ...
- mybatis - 问题记录
记录使用 mybatis 过程中遇到的一些报错,及原因以及解决方法. 1. 报错: Could not find parameter map com.lx.mapper.HotelMapper.map ...
- mysql 查询表的字段名称,字段类型
select column_name,column_comment,data_type from information_schema.columns where table_name='查询表名称' ...
- 关于文本设置overflow:hidden后引起的垂直对齐问题
目前有这样的需求,一行标题中,前面为图标,后面是文字,文字要实现一行省略的效果 首先把文字设为:display: inline-block; 然后设置省略: overflow: hidden; wor ...
- axios拦截登陆过期请求多次
request.interceptors.response.use( response => { console.log(response.data.code) // console.log(r ...
- Linux Exploit系列之三 Off-By-One 漏洞 (基于栈)
Off-By-One 漏洞 (基于栈) 原文地址:https://bbs.pediy.com/thread-216954.htm 什么是off by one? 将源字符串复制到目标缓冲区可能会导致of ...
- 理解JVM之java内存模型
java虚拟机规范中试图定义一种java内存模型(JMM)来屏蔽掉各种硬件和操作系统内存访问差异,以实现让java程序在各种平台都能打到一致的内存访问效果.所以java内存模型的主要目标是定义程序中各 ...