洛谷 P3239 [HNOI2015]亚瑟王(期望+dp)
感觉是道挺好的题,可惜当时没写题解来着的?
根据期望的线性公式,我们求出每个卡牌被发动的概率 \(q_i\),然后
\]
于是我们求出 \(q_i\) 即可。
我们设 \(dp_{i,j}\) 表示在前 \(i\) 张牌里发动了 \(j\) 张牌的概率。
如果已知 \(dp_{i,j}\),那么可以这样求出 \(q_i\):
\]
稍微解释一下这个式子。我们枚举在前 \(i-1\) 个牌里面发动了 \(j\) 个牌。这意味着有 \(j\) 轮不会考虑到第 \(i\) 张牌。在剩下 \(r-j\) 轮当中,\(i\) 号卡牌一次都没被发动的概率为 \((1-p_i)^{r-j}\),\(1-(1-p_i)^{r-j}\) 就是卡牌 \(i\) 至少被发动一次的概率。
那么怎样求 \(dp_{i,j}\) 呢,其实用背包的套路就可以了。分两种情况:
- 如果卡牌 \(j\) 被选,那么 \(dp_{i,j}\) 可以从 \(dp_{i-1,j-1}\) 转移过来。有 \(r-j+1\) 轮会考虑到卡牌 \(i\),卡牌 \(i\) 发动的概率为 \((1-(1-p_i)^{r-j+1})\)。
- 如果卡牌 \(j\) 没被选,那么 \(dp_{i,j}\) 可以从 \(dp_{i-1,j}\) 转移过来。有 \(r-j\) 轮会考虑到卡牌 \(i\),卡牌 \(i\) 未被发动的概率为 \((1-p_i)^{r-j}\)。
综上 \(dp_{i,j}=dp_{i-1,j-1}\times(1-(1-p_i)^{r-j+1})+dp_{i,j}\times(1-p_i)^{r-j}\)
于是这题就做完了,复杂度 \(\mathcal O(Tnr)\)。
另外预处理 \(1-p_i\) 的幂。快速幂会多一个 \(\log\)
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define fz(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define foreach(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++)
#define all(a) a.begin(),a.end()
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,0x3f,sizeof(a))
#define y1 y10101010101
#define y0 y01010101010
typedef pair<int,int> pii;
typedef long long ll;
int T,n,r,d[222];
double p[222],dp[222][222];
double pw[222][222];
inline void clear(){
for(int i=1;i<=n;i++) d[i]=0;
for(int i=1;i<=n;i++) p[i]=0;
for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) dp[i][j]=0;
for(int i=0;i<=n;i++) for(int j=0;j<=r;j++) pw[i][j]=0;
}
inline void solve(){
scanf("%d%d",&n,&r);clear();//remember to clear the data!
for(int i=1;i<=n;i++) scanf("%lf%d",&p[i],&d[i]);
for(int i=1;i<=n;i++){
pw[i][0]=1;
for(int j=1;j<=r;j++){
pw[i][j]=pw[i][j-1]*(1.0-p[i]);//calculate the power of 1-p[i]
// printf("%d %d %.10lf\n",i,j,pw[i][j]);
}
}
dp[0][0]=1;
for(int i=1;i<=n;i++) for(int j=0;j<=i;j++){
dp[i][j]=dp[i-1][j]*pw[i][r-j];
if(j) dp[i][j]+=dp[i-1][j-1]*(1-pw[i][r-j+1]);//calculate dp[i][j] using the fomula above
// printf("%d %d %.10lf\n",i,j,dp[i][j]);
}
double ans=0;
for(int i=1;i<=n;i++){
double prob=0;
for(int j=0;j<=i-1;j++){
prob+=dp[i-1][j]*(1-pw[i][r-j]);//calculate p[i]
}
// printf("%d %.10lf\n",i,prob);
ans+=prob*d[i];
}
printf("%.10lf\n",ans);
}
int main(){
scanf("%d",&T);
while(T--) solve();
return 0;
}
/*
2
3 2
0.5000 2
0.3000 3
0.9000 1
3 2
0.5000 2
0.3000 3
0.9000 1
*/
洛谷 P3239 [HNOI2015]亚瑟王(期望+dp)的更多相关文章
- 洛谷 P3239 [HNOI2015]亚瑟王(期望dp)
题面 luogu 题解 一道复杂的期望\(dp\) 思路来源:__stdcall 容易想到,只要把每张牌打出的概率算出来就可以求出\(ans\) 设\(fp[i]\)表示把第\(i\)张牌打出来的概率 ...
- [洛谷 P3239] [HNOI2015]亚瑟王
[HNOI2015]亚瑟王 题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知, ...
- P3239 [HNOI2015]亚瑟王 期望dp
这个题一看就是期望dp,但是我有个问题,一个事件的期望等于他所有事件可能行乘权值的和吗...为什么我有天考试的时候就不对呢...求大佬解释一下. 至于这道题,f[i][j]代表前i个有j个发动技能,这 ...
- 洛谷P3239 [HNOI2015]亚瑟王
题目描述 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑.他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个看脸的游戏,技能 ...
- P3239 [HNOI2015]亚瑟王 期望 dp
LINK:亚瑟王 Saber!Excalibur! 比较难的期望dp. 可以发现如果暴力枚举所有的局面复杂度很高 . 转换的思路则是 期望的线性性. 求出每张牌的期望累加即可. 考虑每张牌的期望=这张 ...
- 洛谷P3239 [HNOI2015]亚瑟王(期望dp)
传送门 stdcall大佬好强 期望的姿势不是很高……据大佬说期望有一个线性性质,也就是说可以把每一张牌的期望伤害算出来然后再加起来就是总的期望伤害 因为每一张牌只能用一次,我们设$dp[i]$表示第 ...
- P3239 [HNOI2015]亚瑟王——概率DP
题面:亚瑟王 最近考试考期望很自闭啊,没做过这种类型的题,只能现在练一练: 所谓期望,就是状态乘上自己的概率:对于这道题来说,我们要求的是每张牌的伤害乘上打出的概率的和: 当然不是直接乘,因为给的是每 ...
- BZOJ4008: [HNOI2015]亚瑟王(期望dp)
Time Limit: 20 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 1952 Solved: 1159[Submit][Status] ...
- [HNOI2015]亚瑟王(期望+DP)
题解 利用期望的线性性,可以把问题转化为求每一个卡牌造成期望的期望值. 然后我们就需要知道每一个卡牌发动技能的概率. 因为当某一张卡牌发动技能时这一轮会结束,这就很难直接计算了. 我们使用DP 设dp ...
随机推荐
- 免费 CDN 玩法 —— 文件一键上传到 NPM
前言 unpkg.jsdelivr 等站点可加速 NPM 包文件,适合作为个人网站或演示案例的免费 CDN. 虽然上传文件到 NPM 很简单,创建 package.json 然后 npm publis ...
- Spark分区器浅析
分区器作用:决定该数据在哪个分区 概览: 仅仅只有pairRDD才可能持有分区器,普通RDD的分区器为None 在分区器为None时RDD分区一般继承至父RDD分区 初始RDD分区数: 由集合创建,R ...
- JDK中的SPI机制
前言 最近学习类加载的过程中,了解到JDK提供给我们的一个可扩展的接口:java.util.ServiceLoader, 之前自己不了解这个机制,甚是惭愧... 什么是SPI SPI全称为(Servi ...
- F1西班牙大奖赛-加泰罗尼亚赛道地图及简介
背景 银石双赛结束,第二轮三连赛的最后一场将转战西班牙,第50届F1西班牙大奖赛将于本周末(正赛2020-08-15)在加泰罗尼亚赛道上演. 作为近年来F1承办季前测试的赛道,所有人都对这里再熟悉不过 ...
- 服务器端的GPU使用
服务器端的GPU使用 查看GPU信息 查看nvidia GPU信息: # 输入指令 lspci | grep -i nvidia # 结果如下: # 04:00.0 3D controller: NV ...
- [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)
前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...
- 计算机网络之传输层UDP协议
文章转自:https://blog.csdn.net/weixin_43914604/article/details/105453096 学习课程:<2019王道考研计算机网络> 学习目的 ...
- 【http】https加速优化
目录 前言 HTTPS 的连接很慢 https 步骤简要划分 握手耗时 证书验证 CRL OCSP 硬件优化 软件优化 软件升级 协议优化 证书优化 会话复用 会话票证 预共享密钥 前言 主要记录 h ...
- vue.js+elementUI文件上传、文件导入、文件下载
1.文件下载 <el-button plain @click ="exportVmExcel()" size='mini' icon="el-icon-downlo ...
- WPF_05_路由事件
路由事件 WPF用更高级的路由事件替换普通的.NET事件.路由事件具有更强传播能力,可在元素树中向上冒泡和向下隧道传播,并沿着传播路径被事件处理程序处理.与依赖属性一样,路由事件由只读的静态字段表示, ...