[BZOJ4832]抵制克苏恩(概率期望DP)
方法一:倒推,最常规的期望DP。f[i][a][b][c]表示还要再攻击k次,目前三种随从个数分别为a,b,c的期望攻击英雄次数,直接转移即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,M=;
int n,a,b,c,T;
double f[N][M][M][M]; int main(){
freopen("bzoj4832.in","r",stdin);
freopen("bzoj4832.out","w",stdout);
rep(i,,) rep(a,,) rep(b,,-a) rep(c,,-a-b){
int t=(a+b+c<);
f[i][a][b][c]+=(f[i-][a][b][c]+)/(a+b+c+);
if (a) f[i][a][b][c]+=f[i-][a-][b][c]*a/(a+b+c+);
if (b) f[i][a][b][c]+=f[i-][a+][b-][c+t]*b/(a+b+c+);
if (c) f[i][a][b][c]+=f[i-][a][b+][c-+t]*c/(a+b+c+);
}
for (scanf("%d",&T); T--; )
scanf("%d%d%d%d",&n,&a,&b,&c),printf("%.2lf\n",f[n][a][b][c]);
return ;
}
方法二:用顺推做期望DP,f[x]=(f[k]+w[k][x])*p[k][x],其中k是所有能到达x的状态,w[k][x]表示这个转移的代价(攻击随从时为0,攻击英雄时为1),p[k][x]是x由k得到的概率(注意不是k转移到x的概率)。
P(x由k得到)=P(k)*P(k转移到x)/P(x),同时维护p和f即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,M=;
const double eps=1e-;
int n,a,b,c,T;
double p[N][M][M][M],f[N][M][M][M]; int main(){
freopen("bzoj4832.in","r",stdin);
freopen("bzoj4832.out","w",stdout);
for (scanf("%d",&T); T--; ){
memset(p,,sizeof(p)); memset(f,,sizeof(f));
scanf("%d%d%d%d",&n,&a,&b,&c); p[][a][b][c]=; double ans=;
rep(i,,n-) rep(a,,) rep(b,,-a) rep(c,,-a-b){
int t=(a+b+c<);
p[i+][a-][b][c]+=p[i][a][b][c]*a/(a+b+c+);
p[i+][a+][b-][c+t]+=p[i][a][b][c]*b/(a+b+c+);
p[i+][a][b+][c-+t]+=p[i][a][b][c]*c/(a+b+c+);
p[i+][a][b][c]+=p[i][a][b][c]/(a+b+c+);
}
rep(i,,n-) rep(a,,) rep(b,,-a) rep(c,,-a-b){
int t=(a+b+c<); double x=f[i][a][b][c]*p[i][a][b][c];
if (p[i+][a-][b][c]>eps)
f[i+][a-][b][c]+=x*a/((a+b+c+)*p[i+][a-][b][c]);
if (p[i+][a+][b-][c+t]>eps)
f[i+][a+][b-][c+t]+=x*b/((a+b+c+)*p[i+][a+][b-][c+t]);
if (p[i+][a][b+][c-+t]>eps)
f[i+][a][b+][c-+t]+=x*c/((a+b+c+)*p[i+][a][b+][c-+t]);
if (p[i+][a][b][c]>eps)
f[i+][a][b][c]+=(f[i][a][b][c]+)*p[i][a][b][c]/((a+b+c+)*p[i+][a][b][c]);
}
rep(a,,) rep(b,,-a) rep(c,,-a-b) ans+=f[n][a][b][c]*p[n][a][b][c];
printf("%.2lf\n",ans);
}
return ;
}
方法三:同样用顺推,但这里的f是上面的f*p,转移时要考虑期望的定义
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
typedef long long ll;
using namespace std; const int N=,M=;
const double eps=1e-;
int n,a,b,c,T;
double p[N][M][M][M],f[N][M][M][M]; int main(){
for (scanf("%d",&T); T--; ){
memset(p,,sizeof(p)); memset(f,,sizeof(f));
scanf("%d%d%d%d",&n,&a,&b,&c); p[][a][b][c]=; double ans=;
rep(i,,n-) rep(a,,) rep(b,,-a) rep(c,,-a-b){
int t=(a+b+c<);
p[i+][a-][b][c]+=p[i][a][b][c]*a/(a+b+c+);
p[i+][a+][b-][c+t]+=p[i][a][b][c]*b/(a+b+c+);
p[i+][a][b+][c-+t]+=p[i][a][b][c]*c/(a+b+c+);
p[i+][a][b][c]+=p[i][a][b][c]/(a+b+c+);
}
rep(i,,n-) rep(a,,) rep(b,,-a) rep(c,,-a-b){
int t=(a+b+c<);
if (p[i+][a-][b][c]>eps)
f[i+][a-][b][c]+=f[i][a][b][c]*a/(a+b+c+);
if (p[i+][a+][b-][c+t]>eps)
f[i+][a+][b-][c+t]+=f[i][a][b][c]*b/(a+b+c+);
if (p[i+][a][b+][c-+t]>eps)
f[i+][a][b+][c-+t]+=f[i][a][b][c]*c/(a+b+c+);
if (p[i+][a][b][c]>eps)
f[i+][a][b][c]+=(f[i][a][b][c]+p[i][a][b][c])/(a+b+c+);
}
rep(a,,) rep(b,,-a) rep(c,,-a-b) ans+=f[n][a][b][c];
printf("%.2lf\n",ans);
}
return ;
}
[BZOJ4832]抵制克苏恩(概率期望DP)的更多相关文章
- 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp
题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...
- bzoj 4832 抵制克苏恩 概率期望dp
考试时又翻车了..... 一定要及时调整自己的思路!!! 随从最多有7个,只有三种,所以把每一种随从多开一维 so:f[i][j][k][l]为到第i次攻击前,场上有j个1血,k个2血,l个3血随从的 ...
- [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)
4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 673 Solved: 261[Submit][ ...
- 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)
4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 275 Solved: 87 Descripti ...
- [bzoj4832]抵制克苏恩 概率dp
考试的时候打了个搜索,时间比较短,样例又非常的弱,实在不太清楚他这个到底是什么意思. 不过lc大神好腻害,讲解了一下非常的清楚了. f[i][j][k][l]表示第i次伤害(啊),一滴血j个,两滴血k ...
- [BZOJ4832]抵制克苏恩
[BZOJ4832]抵制克苏恩 思路: \(f[i][j][k][l]\)表示打了\(i\)次,血量为\(1\sim 3\)的随从有\(j,k,l\)个的期望.转移时注意避免重复. 源代码: #inc ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp
题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...
- Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp
一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...
随机推荐
- bootstrap框架的搭建
bootstrap框架 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快 ...
- 【洛谷 P1452】 Beauty Contest (二维凸包,旋转卡壳)
题目链接 旋转卡壳模板题把. 有时间再补总结吧. #include <cstdio> #include <cmath> #include <algorithm> u ...
- Desert King(POJ2728+最优比率生成树+二分)
题目链接:http://poj.org/problem?id=2728 题目: 题意:求一颗生成树,使得费用与距离的比值最小,其中距离等于两点之间的平面欧拉距离,费用为z坐标之差. 思路: 由上图我们 ...
- HDU - 5327 Olympiad(一维前缀和)
Olympiad Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem ...
- Mimikatz.ps1本地执行
PS C:\Users\hacker> Get-ExecutionPolicy Restricted PS C:\Users\hacker> Set-ExecutionPolicy Unr ...
- linux下守护进程的创建
最近在学习linux c编程 看到了守护进程的创建,感觉很好玩, 测试环境ubuntu 15.04 下面贴出测试代码 #include <stdio.h> #include <std ...
- linux安装lamp
github https://github.com/zblogcn/zblogphp Installation If your server system: CentOS yum -y install ...
- AJAX 核心 —— XMLHTTPRequest 对象回顾
一.AJAX概述 不使用 AJAX 的网页,如果要更新内容,需要重载整个页面. AJAX ( Asynchronous Javascript And XML ,异步 Javascript 和 XML) ...
- python实战===老司机奇技淫巧系列之字符转换成图片
先放两张效果图:
- mui 选项卡与header文字同步
mui底部tab固定 头部nav可变 <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...