[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\ ...
随机推荐
- 使用.net core abp framework
abp是一个有用的框架,包含许多功能,可以用来作为脚手架. 直接在官方网站上输入相应的工程名称,选择对应的版本就会下载对应的版本..net core 版本的可以使用后端框架部分来做api,包含了常用框 ...
- bzoj 2121 DP
首先如果我们能处理出来i,j段能不能消掉,这样就可以直接dp转移了,设w[i]为前i为最少剩下多少,那么w[i]=w[j-1] (flag[j][i]). 现在我们来求flag[i][j],首先我们可 ...
- 八大疯狂的HTML5 Canvas及WebGL动画效果——8 CRAZY ANIMATIONS WITH WEBGL AND HTML5 CANVAS【收藏】
HTML5, WebGL and Javascript have changed the way animation used to be. Past few years, we can only a ...
- tornado简单使用
这篇适用于快速上手想了解更深:http://www.tornadoweb.cn/ https://tornado-zh.readthedocs.io/zh/latest/ Tornado 是 Fr ...
- 函数导出在kvm_intel.ko,kvm.ko不共享
KVM一共包含了三个内核模块,kvm_intel.ko,kvm_amd.ko,kvm.ko.其中两个重要文件x86.c和vmx.c在编译后分别会生成kvm_intel.ko和kvm.ko两个内核模块, ...
- Linux网络编程之套接字基础
1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* addre ...
- python基础===多线程
https://www.cnblogs.com/wj-1314/p/8263328.html threading 模块 先上代码: import time, threading def loop(): ...
- java===java基础学习(16)---final
final-----概念 1.当不希望父类的某个方法被子类覆盖(override)时,可以用final关键字修饰. 2.当不希望类的某个变量的值被修改时,可以用final修饰.如果要用final,则必 ...
- 自动化测试===requests+unittest+postman的接口测试
postman是一个跨平台的接口测试工具,下载链接在这里:https://www.getpostman.com/ unittest是一个单元测试框架,python中安装:pip install uni ...
- redis cluster 实现
Redis cluster是一个redis官方提供的集群功能,集群节点最小3个节点,配置比较多,记录下来,以供下次使用.我在这使用的redis 4.0.6. 因为最新的ruby redis扩展需要ru ...