Luogu P3239 [HNOI2015]亚瑟王
期望神题。最开始一直尝试推朴素一点的,逻辑上的\(DP\)式子,后来发现一直出锅,可能是我的式子没容斥对。。。
题解中给出的想法是这样的:
首先,如果直接一轮一轮地进行期望推导,会发现前面有冲突的情况。枚举第 \(i\)轮第 \(j\)张卡时既要保证前 \(i-1\)轮都没有发动过第 \(j\) 张卡,又要保证第 \(i\) 轮没有发动过前 \(j−1\) 张卡,再乘 \(p_i\) 算概率。但是这样怎么算都算不对,其实感觉也是一个“意识”调题的过程吧,反正最终把样例调到 \(3.21\) 左右发现概率对不上(样例解释),于是还是放弃了。
因此考虑建立无后效性的\(dp\)方程。因为需要满足 “如果发动了当前的卡”,那么就停止本轮,所以方程需要和前缀有关。令 \(f[i][j]\)表示在所有的 \(r\) 轮里,前 \(i\) 张卡有 \(j\) 个发动了的概率。此时对于任意的第 \(k\) 张卡就可以用 \(f[k-1]\) 有关的数据推出来了。
为了规避前\(i - 1\)张卡带来的影响,题解采取了非常有意思的措施:对于前\(i\)张卡片在全部\(r\)轮中的出现状况做出统计,从而不必再次考虑前面卡牌的约束。第一张卡片在\(r\)轮中均为出现的概率是\((1-p_1)^r\)。对于每个访问到的\(i\),前面\(i-1\)张的出现情况已被纳入统计,可以忽略前面的所有影响,即把其在任意\(k\)轮中未出现的概率转换为\((1 - p_i)^{k}\)(感性的说,就是前\(i-1\)张卡都不会在这\(k\)次中出现,所以第\(i\)张就是第一张,前面带来的要乘上去的概率就是\(1\))。
转换完成后接下来就是比较简单的\(DP\)推导了。具体请移步__stdcall学长的博客。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int T, n, r;
double d[N], p[N], fp[N], _pow[N][N], f[N][N];
void Init () {
memset (f, 0, sizeof (f));
memset (fp, 0, sizeof (fp));
}
int main () {
cin >> T;
while (T--) {
Init ();
cin >> n >> r;
for (int i = 1; i <= n; ++i) {
cin >> p[i] >> d[i];
}
for (int i = 1; i <= n; ++i) {
_pow[i][0] = 1.0;
for (int j = 1; j <= r; ++j) {
_pow[i][j] = _pow[i][j - 1] * (1.0 - p[i]);
}
}
f[1][0] = _pow[1][r], f[1][1] = fp[1] = 1 - f[1][0];
for (int i = 2; i <= n; ++i) {
for (int j = 0; j <= r; ++j) {
fp[i] += f[i - 1][j] * (1 - _pow[i][r - j]);
if (j != 0) {
f[i][j] += f[i - 1][j - 1] * (1 - _pow[i][r - j + 1]);
}
f[i][j] += f[i - 1][j] * _pow[i][r - j];
}
}
//_pow[i][j] = (1 - p[i]) ^ j
double ans = 0;
for (int i = 1; i <= n; ++i) ans += fp[i] * d[i];
printf ("%.10lf\n", ans);
}
}
Luogu P3239 [HNOI2015]亚瑟王的更多相关文章
- [洛谷 P3239] [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...
- 洛谷P3239 [HNOI2015]亚瑟王
题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...
- P3239 [HNOI2015]亚瑟王——概率DP
题面:亚瑟王 最近考试考期望很自闭啊,没做过这种类型的题,只能现在练一练: 所谓期望,就是状态乘上自己的概率:对于这道题来说,我们要求的是每张牌的伤害乘上打出的概率的和: 当然不是直接乘,因为给的是每 ...
- P3239 [HNOI2015]亚瑟王 期望dp
这个题一看就是期望dp,但是我有个问题,一个事件的期望等于他所有事件可能行乘权值的和吗...为什么我有天考试的时候就不对呢...求大佬解释一下. 至于这道题,f[i][j]代表前i个有j个发动技能,这 ...
- P3239 [HNOI2015]亚瑟王 期望 dp
LINK:亚瑟王 Saber!Excalibur! 比较难的期望dp. 可以发现如果暴力枚举所有的局面复杂度很高 . 转换的思路则是 期望的线性性. 求出每张牌的期望累加即可. 考虑每张牌的期望=这张 ...
- 洛谷 P3239 [HNOI2015]亚瑟王(期望dp)
题面 luogu 题解 一道复杂的期望\(dp\) 思路来源:__stdcall 容易想到,只要把每张牌打出的概率算出来就可以求出\(ans\) 设\(fp[i]\)表示把第\(i\)张牌打出来的概率 ...
- P3239 [HNOI2015]亚瑟王
思路 神仙概率dp 由于期望的线性性质,能够想到最后要求的期望价值就是把每个卡牌发动的概率\(g_i\)乘上伤害\(val_i\)之后加到一起 然后怎么求\(g_i\)呢,肯定是要dp的 我想了例如d ...
- 洛谷P3239 [HNOI2015]亚瑟王(期望dp)
传送门 stdcall大佬好强 期望的姿势不是很高……据大佬说期望有一个线性性质,也就是说可以把每一张牌的期望伤害算出来然后再加起来就是总的期望伤害 因为每一张牌只能用一次,我们设$dp[i]$表示第 ...
- 洛谷 P3239 [HNOI2015]亚瑟王(期望+dp)
题面传送门 感觉是道挺好的题,可惜当时没写题解来着的? 根据期望的线性公式,我们求出每个卡牌被发动的概率 \(q_i\),然后 \[ans=\sum\limits_{i=1}^np_id_i \] 于 ...
随机推荐
- nginx反向代理(动静分离)
使用反向代理(动静分离)可以让nginx专注静态内容,把动态请求交给apache来处理,发挥各自的优势,而且整个架构更加清晰: 这里假设你已经搭建好了nginx环境; 为了简单起见,就不用源码编译安装 ...
- Jarvis OJ A Piece Of Cake
看图片的隐写术自闭,本来想看一看jarvisoj 的basic放松一下心情,结果一道题就做了一晚上qwq 首先看到这道题的时候想到的是凯撒密码(这其实是Google之后才知道这个名字的)枚举了26种位 ...
- IDEA下载依赖时提示 resolving dependencies of xxx, yyy
IDEA下载依赖时提示 resolving dependencies of xxx, yyy ,卡住不动 使用Maven命令可以更清楚地分析问题,在IDEA命令行窗口执行mvn compile命令,提 ...
- IntelliJ cannot log in to GitHub上传github报错解决
重装系统,新装的Intellij IDEA上新建的项目上传github失败,报错: invalid authentication token ... 此处多为本地git用户的用户名/邮箱,与之前设置的 ...
- Nginx+uwsgi部署 Diango(生产环境)
环境:CentOS6.5 + Nginx1.11.5 + Python3.5.2 1. 安装基础软件包 yum install -y zlib-devel bzip2-devel \ pcre-dev ...
- [51Nod 1584] 加权约数和
Description 在整理以前的试题时,他发现了这样一道题目:"求 \(\sum\sigma(i)\),其中 \(1≤i≤N\),\(σ(i)\) 表示 \(i\) 的约数之和.&quo ...
- HDU4864 Task(算竞进阶习题)
贪心 比较巧妙的贪心..先把所有机器和任务按时间是第一关键字,等级为第二关键字排序. 然后用机器去匹配每一个任务. 排序之后,在时间上满足当前任务的机器,必定也在时间上满足后面的机器,所以我们每次把时 ...
- 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并
题目大意 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) \(1\leq n\leq 1 ...
- 自学华为IoT物联网_12 Huawei LiteOS基础架构
点击返回自学华为IoT物流网 自学华为IoT物联网_12 Huawei LiteOS基础架构 一.1个Huawei LiteOS Kernel 1.1 huawei LiteOS Kernel基本框架 ...
- Android 开发中 SQLite 数据库的使用
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, ...