传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4008

一道不简单的概率和期望dp题

根据期望的线性性质,容易想到,可以算出每张卡的期望伤害,然后全部加在一起

手算样例之后发现是正确的,那么我们只要求出每张卡的实际被使用的概率就可以了

记第$i$张卡的实际被使用的概率为$fp[i]$

那么答案就是

$\Large\sum\limits_{i=0}^{n-1}fp[i]\cdot d[i]$

如何求出$fp[i]$?

首先考虑第一张卡的$fp$,也就是$fp[0]$,应该为

$\Large fp[0]=1-(1-p[i])^{r}$

这个很容易理解,因为$(1-p[i])^r$就是这张卡从头到尾始终憋着不出的概率

那么对于后面的$fp$应该怎么求呢

有个条件很烦人,就是在每一轮中,出了一张卡的时候立即结束该轮

那么下面就轮到dp上场啦!

令$f[i][j]$表示在所有的$r$轮中,前$i$张卡中一共出了$j$张的概率,那么就可以用$O(n)$的时间算出$fp[i](i>0)$

枚举前$i-1$轮选了$j$张牌,那么有$j$轮不会考虑到第$i$张牌,也就是有$r-j$轮会考虑到第$i$张牌

那么根据上面的分析,$1-(1-p[i])^{r-j}$就是在$r-j$轮中使用过第$i$张牌的概率,式子:

$\Large fp[i]=\sum\limits_{j=0}^{r}f[i-1][j]\cdot(1-(1-p[i])^{r-j})(i>0)$

接下来只要写出$f[i][j]$的转移方程就好了,分两种情况讨论

第一种,$f[i][j]$从$f[i-1][j]$转移过来,即第$i$张牌最终没有选,始终不选第$i$张牌的概率是$(1-p[i])^{r-j}$

$\Large f[i][j]+=f[i-1][j]\cdot(1-p[i])^{r-j}(i>0)$

第二种,当$j>0$时,$f[i][j]$可以从$f[i-1][j-1]$转移过来,表示最终选择了第$i$张牌

这时候,有$j-1$轮没有考虑到第$i$张牌,所以考虑到第$i$张牌的轮数是$r-j+1$,最终选择的概率为$1-(1-p[i])^{r-j+1}$

$\Large f[i][j]+=f[i-1][j-1]\cdot(1-(1-p[i])^{r-j+1})(i>0,j>0)$

然后就没了,总时间复杂度$O(Tnr)$,具体细节看代码

因为洛谷上有点卡时,所以预处理了$(1-p[i])$的幂

 #include <cstring>
#include <algorithm>
#include <cstdio> using namespace std;
const int MAXN = ;
const int MAXR = ; int n, r, d[MAXN];
double p[MAXN], fp[MAXN]; double pow1p[MAXN][MAXN]; // pow1p[i][j]表示(1-p[i])^j
void prelude() {
for( int i = ; i < n; ++i ) {
pow1p[i][] = ;
for( int j = ; j <= r; ++j )
pow1p[i][j] = pow1p[i][j-] * (-p[i]);
}
} double f[MAXN][MAXR];
double solve() {
memset( f, , sizeof(f) );
memset( fp, , sizeof(fp) );
f[][] = pow1p[][r]; // 边界
f[][] = fp[] = -f[][];
for( int i = ; i < n; ++i ) {
for( int j = ; j <= r; ++j ) {
fp[i] += f[i-][j] * ( - pow1p[i][r-j]); // 根据f计算fp
f[i][j] += f[i-][j] * pow1p[i][r-j]; // 不选第i张
if( j ) f[i][j] += f[i-][j-] * ( - pow1p[i][r-j+]); // 选第i张
}
}
double rtn = ;
for( int i = ; i < n; ++i ) {
// printf( "fp[%d] = %lf\n", i, fp[i] );
rtn += d[i] * fp[i];
}
return rtn;
} int main() {
int T; scanf( "%d", &T );
while( T-- ) {
scanf( "%d%d", &n, &r );
for( int i = ; i < n; ++i ) scanf( "%lf%d", p+i, d+i );
prelude();
printf( "%.10lf\n", solve() );
}
return ;
}

【题解】亚瑟王 HNOI 2015 BZOJ 4008 概率 期望 动态规划的更多相关文章

  1. UOJ#196. 【ZJOI2016】线段树 概率期望,动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ196.html 题解 先离散化,设离散化后的值域为 $[0,m]$ . 首先把问题转化一下,变成:对于每一个位置 $i$ ...

  2. BZOJ5305 HAOI2018苹果树(概率期望+动态规划)

    每种父亲编号小于儿子编号的有标号二叉树的出现概率是相同的,问题相当于求所有n个点的此种树的所有结点两两距离之和. 设f[n]为答案,g[n]为所有此种树所有结点的深度之和,h[n]为此种树的个数. 枚 ...

  3. BZOJ4899 记忆的轮廓(概率期望+动态规划+决策单调性)

    容易发现跟树没什么关系,可以预处理出每个点若走向分叉点期望走多少步才能回到上个存档点,就变为链上问题了.考虑dp,显然有f[i][j]表示在i~n中设置了j个存档点,其中i设置存档点的最优期望步数.转 ...

  4. BZOJ4770 图样(概率期望+动态规划)

    考虑求出所有MST的权值和再除以方案数,方案数显然是2mn. 按位考虑,显然应该让MST里的边高位尽量为0.那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条 ...

  5. BZOJ4832 抵制克苏恩(概率期望+动态规划)

    注意到A+B+C很小,容易想到设f[i][A][B][C]为第i次攻击后有A个血量为1.B个血量为2.C个血量为3的期望伤害,倒推暴力转移即可. #include<iostream> #i ...

  6. 【BZOJ4008】[HNOI2015]亚瑟王

    [BZOJ4008][HNOI2015]亚瑟王 题面 bzoj 洛谷 题解 由期望的线性性 可以知道,把所有牌打出的概率乘上它的伤害加起来就是答案 记第$i$张牌打出的概率为$fp[i]$ 则 $$ ...

  7. bzoj 2969: 矩形粉刷 概率期望

    题目: 为了庆祝新的一年到来,小M决定要粉刷一个大木板.大木板实际上是一个W*H的方阵.小M得到了一个神奇的工具,这个工具只需要指定方阵中两个格子,就可以把这两格子为对角的,平行于木板边界的一个子矩形 ...

  8. bzoj 4008 亚瑟王 - 动态规划 - 概率与期望

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

  9. bzoj[HNOI2015]亚瑟王 - 递推与动规 - 概率与期望

    [bzoj4008][HNOI2015]亚瑟王 2015年4月22日3,2991 Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之 ...

随机推荐

  1. linux-shell-变量参数

    sxt1 的生命周期随着调起而生效,结束就消失 子进程和父进程的关系,

  2. 北航MOOC客户端

    我们的团队作业终于完成了,欢迎下载使用我们的北航MOOC手机客户端软件(Android端)——北航学堂,学习北航的公开课程. 安装包下载地址: http://pan.baidu.com/s/1jGvH ...

  3. M2阶段事后总结

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述?我们的主要任务是将35w+个符合条件的网页,问答,文章放入数据库:爬取功能定义为以下几种:通用型爬取 ...

  4. 【M2】软件工程终期总结报告——阅读作业

    PhylabWeb——阅读作业 问题回顾 提问博客地址:http://www.cnblogs.com/kibbon/p/4831104.html 尚待解决的问题: Alpha/Beta,ZBB/RC阶 ...

  5. 《linux内核设计与实现》第五章

    第五章 系统调用 一.与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层.作用: 为用户空间提供了一种硬件的抽象接口. 系统调用保证了系统的稳定和安全. 每个进程都运行在虚拟系统中,而在 ...

  6. 《Linux内核分析》期终总结&《Linux及安全》期中总结

    <Linux内核分析>期终总结&<Linux及安全>期中总结 [李行之 原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc. ...

  7. 《Linux内核分析》课程第七周学习总结

    姓名:何伟钦 学号:20135223 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  8. MySQLi面向对象实践--select

    对于update.insert.delete请参考http://www.cnblogs.com/-beyond/p/8457580.html 执行select,如果SQL语句执行成功,那么返回的是一个 ...

  9. [Wiki].NET框架

    .NET框架 建议将.NET Framework 3.0并入本条目或章节.(讨论)  .NET框架 .NET框架的组件堆栈 开发者 Microsoft 初始版本 2002年2月13日,​16年前 稳定 ...

  10. [转帖]UEFI和BIOS

    UEFI和Legacy及UEFI+Legacy启动的区别 https://www.cnblogs.com/net5x/p/6850801.html 一直给人装系统 但是连这些最基本的都不知道 感觉自己 ...