题面:亚瑟王

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

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

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

设每张牌打出的概率是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. Angular 学习笔记 ( 我追的 feature 和 bug )

    Angular 有许多功能还不齐全,也有不少 bug 让人很头疼,所以这里做一些记入 Angular Bug 1.input type="number", valueChanges ...

  2. Tomcat一闪而过的调试方法

    很少用tomcat来部署,都是用springboot微服务.只是以前学的时候搞demo试过而已. 软件测试的期末作业要求要测一个Javaweb的项目,给了一个包然后要求部署在tomcat中并启动. 然 ...

  3. Android SDK版本号 与 API Level 对应关系 201911

    API是开发用的,所以API LEVEL可以认为是内部的:而SDK的版本提供了新特性给用户,是外部可见的. 可以查看以下网址以获取最新的对应关系:  http://developer.android. ...

  4. WPF不同方式快捷键判断

    private void Window_PreviewKeyDown(object sender, KeyEventArgs e) { //单个按键e.Key方式判断 if (e.Key == Key ...

  5. .net core使用CSRedisCore连接哨兵集群,并用作redis使用分布式缓存。

    CSRedisCore是国内大佬出品的一个Redis-Cli-SDK. Github地址:https://github.com/2881099/csredis 使用此插件作为分布式缓存也十分简单. 一 ...

  6. JavaScript 基础(数据类型、函数、流程控制、对象)

    一.JavaScript概述 1.1 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名Script ...

  7. 数据结构与算法(周测3-Huffman树)

    判断题 1.Given a Huffman tree for N (≥2) characters, all with different weights. The weight of any non- ...

  8. 查询自动生成Guid列

    --newid()可以在查询的时候自动生成Guid列 ' ordey by Random --创建对应的列 用 uniqueidentifier 类型 IF NOT EXISTS ( SELECT * ...

  9. docker 部署oracle

    Oracle数据库服务器Docker映像文档 Oracle Database Server 12c R2是行业领先的关系数据库服务器.Oracle数据库服务器Docker映像包含在Oracle Lin ...

  10. 基于ELK的日志分析、存储、展示

    原文:https://blog.51cto.com/11134648/2163789 ELK简介 ELK是一套完整的日志解决方案,由ElasticSearch.Logstash. Kibana这三款开 ...