[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\ ...
随机推荐
- ZOJ3229 Shoot the Bullet [未AC]
Time Limit: 2 Seconds Memory Limit: 32768 KB Special Judge Gensokyo is a world which exist ...
- Bzoj2832 / Bzoj3874 宅男小C
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 124 Solved: 26 Description 众所周知,小C是个宅男,所以他的每天的食物要靠外 ...
- 【NOIP】提高组2013 积木大赛
[算法]找规律(听说还有写RMQ的www) [题解]ans+=(a[i]-a[i-1]) (i=1...n)(a[i]>a[i-1]) 后面比前面大k,说明要新叠加k个区间来达到所需高度.(看 ...
- urllib3使用指南
对比urllib,用urllib3处理http请求十分方便,可以嵌入web服务后端用于访问其它web实例提供的接口 一.安装 pip install urllib3 二.初始化 导入urllib3 i ...
- auto-keras 测试保存导入模型
# coding:utf-8 import time import matplotlib.pyplot as plt from autokeras import ImageClassifier# 保存 ...
- Python 关于拷贝(copy)汇总(列表拷贝 // 字典拷贝 // 自定义对象拷贝)
1.列表拷贝 引用是指保存的值为对象的地址.在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些.下面举个例子: 问题描述:已知一个列表, ...
- python面向对象进阶(下)
一.item系列:就是把字典模拟成一个字典去操作(操作字典就用item的方式) obj[‘属性’]的方式去操作属性时触发的方法 __getitem__:obj['属性'] 时触发 __setitem_ ...
- markdown===在新窗口中打开网址的解决办法,以及其他遗留问题!
[超链接文字](url){:target="_blank"} 遗留问题: 如何设置图片的尺寸 我的复选框一直不生效,why? 公式 $$ 公式 $$ 不生效 如何设置代码块的背景颜 ...
- mongodb 学习笔记 2 --- 修改器
修改器是为了爱update文档时,不需要传入整个文档就能修改当前文档的某个属性值,修改器用法如下: 假设数据库中foo集合中存在如下文档:{"name":"jack&qu ...
- [New learn] 网络基础-apache本地服务搭建(支持php)
1.简介 无网不利,无网不胜.对于移动应用来说离开网络那和咸鱼有什么分别?所以对于开发者来说更要学习好网络开发的技术. 2.搭建apache本地服务器 1.在finder中显示影藏的用户文件夹 fin ...