题面:亚瑟王

最近考试考期望很自闭啊,没做过这种类型的题,只能现在练一练;

所谓期望,就是状态乘上自己的概率;对于这道题来说,我们要求的是每张牌的伤害乘上打出的概率的和;

当然不是直接乘,因为给的是每轮中这张牌打出的概率,这张牌没打出就要考虑下一张牌,要有一张牌发出技能才能结束一轮;除非一张牌都发不出来;

设每张牌打出的概率是exp[],答案就是exp[i]*d[i];

exp[i]怎么求?

我们要始终在概率面前一视同仁;

因为牌只有出和不出两种状态,概率和为1;

exp[1]=1-(1-p[1])即为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的更多相关文章

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

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

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

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

  3. 【bzoj4008】[HNOI2015]亚瑟王 概率dp

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

  4. 洛谷 P3239 [HNOI2015]亚瑟王(期望dp)

    题面 luogu 题解 一道复杂的期望\(dp\) 思路来源:__stdcall 容易想到,只要把每张牌打出的概率算出来就可以求出\(ans\) 设\(fp[i]\)表示把第\(i\)张牌打出来的概率 ...

  5. [洛谷 P3239] [HNOI2015]亚瑟王

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

  6. 洛谷P3239 [HNOI2015]亚瑟王

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

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

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

  8. P3239 [HNOI2015]亚瑟王

    思路 神仙概率dp 由于期望的线性性质,能够想到最后要求的期望价值就是把每个卡牌发动的概率\(g_i\)乘上伤害\(val_i\)之后加到一起 然后怎么求\(g_i\)呢,肯定是要dp的 我想了例如d ...

  9. luoguP3239 [HNOI2015]亚瑟王 概率期望DP

    当初怎么想的来着.....又忘了...... 首先,总期望 = 每张卡片的期望之和 求期望,只要我们求出每张卡片被用掉的概率即可 如果直接上状态$f[i][j]$表示在第$i$轮中,第$j$张牌发动的 ...

随机推荐

  1. ExcelReport.cs Excel操作类、实例源码下载

    标题一.告别ASP.NET操作EXCEL的烦恼标题二.ASP.NET操作EXCEL 合并单元格 大全... cnblogs/hanzhaoxin/韩兆新的博客园ExcelReport第一篇:使用Exc ...

  2. Docker可视化管理工具portainer的简单应用

    portainer简介 略 安装portainer $ docker pull portainer/portainer$ docker volume create portainer_data $ d ...

  3. interface Part1(接口详解)

    1. 在日常生活中,手机.笔记本电脑.平板电脑等电子产品提供了不同类型的接口用于充电或者连接不同的设备. 不同类型接口的标准不一样,例如电压.尺寸等. 2. 在C#语言中,接口也会定义一种标准,如果需 ...

  4. 3_PHP表达式_5_数据类型转换_类型强制转换

    以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP类型转换分为类型自动转换和类型强制转换. 3.5.2 类型强制转换 类型强制转换允许编程人员手动将变量的数据 ...

  5. textarea与标签组合,点击标签填入标签内容,再次点击删除内容(vue)

    需求:将textarea与span标签组合,点击标签自动填入标签文本内容,再次点击删除标签文本对应内容 原理:点击标签时,将标签内容作为参数,将内容拼接在textarea的value后面,再次点击标签 ...

  6. nginx关闭日志功能access_log关闭

    网上一堆错误示例,我就不吐槽了,未经验证的各种关闭配置.emmm.... 错误示例: error_log off ; access_log on; 以上这些会产生名字为 off/on 的日志文件... ...

  7. 多个div并排不换行

    1.所有div的父元素不换行   white-space: nowrap; 2.所有div设置为行内元素  display: inline-block; 基于java记账管理系统[尚学堂·百战程序员]

  8. 【转载】2018年最值得期待的5大BPM厂商

    部署BPM软件可以帮助企业获得竞争优势,通过分析.设计.执行.控制和调节业务流程协助企业领导者提高组织绩效. 业务流程管理(BPM)是指随着公司和组织的发展匹配业务目标和流程的行为.部署BPM软件可以 ...

  9. awk 条件及循环语句和字符串函数

    条件语句 if(条件表达式) 动作1 else if(条件表达式) 动作2 else 动作3 循环语句: while循环: while(条件表达式) 动作 do while循环: do 动作 whil ...

  10. 《Python编程:从入门到实践》第三章 列表简介 习题答案

    #3.1 names=['lpr','tjl','gnl','by','dqy']; print(names[0]); print(names[1]); print(names[2]); print( ...