也许更好的阅读体验

\(\mathcal{Description}\)

给出\(n\)个技能,每个技能按输入顺序有\(p[i]\)的概率释放并造成\(d[i]\)的伤害。每轮游戏从前往后顺序查看每个技能,若技能发动过则跳过,没发动过则以\(p[i]\)的技能发动,即每个技能只能发动一次,若将一个技能发动,则进行下一轮游戏,没有成功发动或被跳过就查看下一个技能,一轮游戏可能每个技能都不发动,问\(r\)轮游戏一共能造成的伤害期望。

输入方式

T组数据

接下来组数据

每组数据第一行\(n,r\)

接下来\(n\)行\(p_i,d_i\)表示该技能发动概率以及伤害

\(1 <= T <= 444, 1 <= n <= 220, 0 <= r <= 132, 0 < p_i < 1, 0 <= d_i <= 1000\)

输出格式

每组数据输出一行期望伤害,建议保留\(10\)位小数

\(\mathcal{Solution}\)

因为有一个顺序查看的限制,没有后效性的状态是十分不好设的,因为不知道前面有几个技能发动了,若一个技能前面的技能在某轮发动了,则该技能本轮一定不能发动,若前面有些技能发动过,则它们都会被跳过

为了解决这种情况,我们设状态时试着强制限制技能发动(\(nr\)枚举情况),当然,设的状态仍然要满足 所有 情况都考虑在内

设\(f[i][j]\)表示对前\(i\)个技能进行了\(j\)轮游戏造成的 概率

若有前\(i\)个技能进行了\(j\)

则有\(j\)轮不会考虑第\(i+1\)个技能

即有\(r-j\)轮游戏选择了\(i\)之后的技能

此时考虑第\(i+1\)个技能的情况,分为两种

  1. 有\(p[i+1]^{r-j}\)的概率\(i+1\)号技能从未发动
  2. 有\(1-p[i+1]^{r-j}\)的概率\(i+1\)号技能发动过

需要注意的是,此时 已经 确定前\(i\)个技能进行并 只进行 了\(j\)轮游戏,其概率应该也计算在内

所以有

  1. \(f[i+1][j]+=1-p[i+1]^{r-j}f[i][j]\)
  2. \(f[i+1][j+1]+=(1-p[i+1]^{r-j})f[i][j]\)

\(j+1\)要小于等于\(r\)

初值\(f[0][0]=1\),答案在中途计算

计算了概率,别忘了求的是期望伤害,在求概率的时候顺便用概率乘以伤害

\(\mathcal{Code}\)

/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年07月22日 星期一 14时17分22秒
*******************************/
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 255;
int T,n,r;
double ans;
double p[maxn],d[maxn];
double f[maxn][maxn];
int main()
{
scanf("%d",&T);
while (T--){
scanf("%d%d",&n,&r);
for (int i=1;i<=n;++i) scanf("%lf%lf",&p[i],&d[i]);
for (int i=0;i<=n;++i)
for (int j=0;j<=r;++j)
f[i][j]=0;
ans=0,f[0][0]=1;
for (int i=0;i<=n-1;++i){
int k=min(i,r);
for (int j=0;j<=k;++j){
double tmp=pow(1-p[i+1],r-j);
f[i+1][j]+=f[i][j]*tmp;
if (j+1<=r){
f[i+1][j+1]+=f[i][j]*(1-tmp);
ans+=f[i][j]*(1-tmp)*d[i+1];//计算第i+1张牌造成的期望伤害
}
}
}
printf("%.10lf\n",ans);
}
return 0;
}

本篇博客亦被收进期望总结

如有哪里讲得不是很明白或是有错误,欢迎指正

如您喜欢的话不妨点个赞收藏一下吧

[HNOI2015]亚瑟王[期望DP]的更多相关文章

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

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

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

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

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

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

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

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

  5. [HNOI2015]亚瑟王(期望+DP)

    题解 利用期望的线性性,可以把问题转化为求每一个卡牌造成期望的期望值. 然后我们就需要知道每一个卡牌发动技能的概率. 因为当某一张卡牌发动技能时这一轮会结束,这就很难直接计算了. 我们使用DP 设dp ...

  6. BZOJ [HNOI2015]亚瑟王 ——期望DP

    发现每张卡牌最后起到作用只和是否打出去了有关. 而且每张牌打出去的概率和之前的牌打出去的情况有关. 所以我们按照牌的顺序进行DP. 然后记录$i$张牌中打出$j$张的概率,然后顺便统计答案. 直接对系 ...

  7. 【BZOJ4008】[HNOI2015]亚瑟王 期望

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

  8. 【BZOJ4008】【HNOI2015】亚瑟王 [期望DP]

    亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 小 K 不慎被 LL 邪教洗脑了,洗 ...

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

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

随机推荐

  1. R3 HOOK OpenProcess 的问题

    unit HookAPI; //Download by http://www.codefans.net interface uses Windows, Classes; function Locate ...

  2. Qt浅谈之二:钟表(时分秒针)

    一.简介 QT编写的模拟时钟,demo里的时钟只有时针和分针,在其基础上添加了秒针,构成了一个完整的时钟.能对2D绘图中坐标系统.平移变换(translate).比例变换(scale).旋转变换(ro ...

  3. 八大排序算法 JAVA实现 亲自测试 可用!

    今天很高兴 终于系统的实现了八大排序算法!不说了 直接上代码 !代码都是自己敲的, 亲测可用没有问题! 另:说一下什么是八大排序算法: 插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排 ...

  4. 3023Java_控制语句

    控制语句 0.前定义 语句块(有时叫做复合语句),是用花括号扩起的任意数量的简单Java语句. 块确定了局部变量的作用域.块中的程序代码,作为一个整体,是要被一起执行的. 块可以被嵌套在另一个块中,但 ...

  5. Netty源码分析--Reactor模型(二)

    这一节和我一起开始正式的去研究Netty源码.在研究之前,我想先介绍一下Reactor模型. 我先分享两篇文献,大家可以自行下载学习.  链接:https://pan.baidu.com/s/1Uty ...

  6. __file__、__name__、__dict__方法整理

    本文主要介绍__file__.__name__.__dict__三个方法的作用. #01 __file__:打印当前文件的位置. # import os # print(__file__) # 在py ...

  7. 【协议】TCP与UDP

    转载地址:https://blog.csdn.net/qq_34988624/article/details/85856848 1.为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不 ...

  8. php中使用trait设计单例

    trait Singleton { private static $instace = null; private function __construct() { } private functio ...

  9. 手把手docker部署java应用(初级篇)

    本篇原创发布于 Flex 的个人博客:点击跳转 前言   在没有 docker 前,项目转测试是比较麻烦的一件事.首先会化较长的时间搭建测试环境,然后在测试过程中又经常出现测试说是 bug,开发说无法 ...

  10. 深度残差网络(ResNet)

    引言 对于传统的深度学习网络应用来说,网络越深,所能学到的东西越多.当然收敛速度也就越慢,训练时间越长,然而深度到了一定程度之后就会发现越往深学习率越低的情况,甚至在一些场景下,网络层数越深反而降低了 ...