[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\ ...
随机推荐
- shell 给未定义的变量设定默认值 ${parameter:-word}
参考: [ Unix & Linux ] Shell Demo $echo ${JENKINS_VERSION:-2.7.4} 2.7.4 $JENKINS_VERSION=2.99 $ech ...
- hdu 1159 Common Subsequence(最长公共子序列 DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- copy_from_user分析
前言 copy_from_user函数的目的是从用户空间拷贝数据到内核空间,失败返回没有被拷贝的字节数,成功返回0.它内部的实现当然不仅仅拷贝数据,还需要考虑到传入的用户空间地址是否有效,比如地址是不 ...
- C#通过反射获取类中的方法和参数个数,反射调用方法带参数
using System; using System.Reflection; namespace ConsoleApp2 { class Program { static void Main(stri ...
- php设计模式五----适配器模式
1.简介 适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 意图:将一个类的接口转换成客户希望的另外一个接口 ...
- [PAT] 1143 Lowest Common Ancestor(30 分)1145 Hashing - Average Search Time(25 分)
1145 Hashing - Average Search Time(25 分)The task of this problem is simple: insert a sequence of dis ...
- Fel表达式实践
项目背景 订单完成后,会由交易系统推送实时MQ消息给订单清算系统,告诉清算系统此订单交易完成,可以进行给商家结算等后续操作. 财务要求在交易推送订单到清算系统时和订单清算系统接收到订单消息后,需要按照 ...
- hive学习(二) hive操作
hive ddl 操作官方手册https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL hive dml 操作官方手 ...
- Idea创建模板
新建文件模板 /** * * @author zenglw * @date ${DATE} */ Mapper #if (${PACKAGE_NAME} && ${PACKAGE_NA ...
- Linux 基础——ls 命令
第二天,继续学习Linux命令... 一.查看文件和目录列表的命令 ls:显示当前目录下的文件和目录,但是不会显示隐藏的文件和目录. ls -a:显示当前目录下的所有文件和目录. ls -l:显示当前 ...