方法一:倒推,最常规的期望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)的更多相关文章

  1. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp

    题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...

  2. bzoj 4832 抵制克苏恩 概率期望dp

    考试时又翻车了..... 一定要及时调整自己的思路!!! 随从最多有7个,只有三种,所以把每一种随从多开一维 so:f[i][j][k][l]为到第i次攻击前,场上有j个1血,k个2血,l个3血随从的 ...

  3. [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 673  Solved: 261[Submit][ ...

  4. 【BZOJ 4832 】 4832: [Lydsy2017年4月月赛]抵制克苏恩 (期望DP)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 275  Solved: 87 Descripti ...

  5. [bzoj4832]抵制克苏恩 概率dp

    考试的时候打了个搜索,时间比较短,样例又非常的弱,实在不太清楚他这个到底是什么意思. 不过lc大神好腻害,讲解了一下非常的清楚了. f[i][j][k][l]表示第i次伤害(啊),一滴血j个,两滴血k ...

  6. [BZOJ4832]抵制克苏恩

    [BZOJ4832]抵制克苏恩 思路: \(f[i][j][k][l]\)表示打了\(i\)次,血量为\(1\sim 3\)的随从有\(j,k,l\)个的期望.转移时注意避免重复. 源代码: #inc ...

  7. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  8. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  9. Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

    一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...

随机推荐

  1. Http跨域时候预检没通过的几种原因

    网上大多数涉及的原因(直接复制粘帖): CORS把HTTP请求分成两类,不同类别按不同的策略进行跨域资源共享协商. 1. 简单跨域请求. 当HTTP请求出现以下两种情况时,浏览器认为是简单跨域请求: ...

  2. 深入理解Spring MVC(山东数漫江湖)

    初始工程 使用Spring Boot和web,thymeleaf的starter来设置初始工程.xml配置如下: <parent>   <groupId>org.springf ...

  3. TOJ 1049 Jesse's problem (最短路 floyd)

    描述 All one knows Jesse live in the city , but he must come to Xiasha twice in a week. The road is to ...

  4. Nodejs mac版安装

    Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven ...

  5. 深入理解 JavaScript(五)

    根本没有“JSON 对象”这回事! 前言 写这篇文章的目的是经常看到开发人员说:把字符串转化为 JSON 对象,把 JSON 对象转化成字符串等类似的话题,所以把之前收藏的一篇老外的文章整理翻译了一下 ...

  6. $scope作用及模块化解决全局问题

    $scope对象就是一个普通的JavaScript对象,我们可以在其上随意修改或添加属性.$scope对象在AngularJS中充当数据模型,但与传统的数据模型不一样,$scope并不负责处理和操作数 ...

  7. 【openjudge】C15C Rabbit's Festival CDQ分治+并查集

    题目链接:http://poj.openjudge.cn/practice/C15C/ 题意:n 点 m 边 k 天.每条边在某一天会消失(仅仅那一天消失).问每一天有多少对点可以相互到达. 解法:开 ...

  8. aspxpivotgrid排序

    protected virtual void SetSortBySummary() { foreach (PivotGridField field in grid.Fields) { if (fiel ...

  9. NOIP 2011 Day 1

    NOIP 2011 Day 1 tags: NOIP 搜索 categories: 信息学竞赛 总结 铺地毯 选择客栈 Mayan游戏 铺地毯 Solution 因为只会询问一个点被谁覆盖, 而且后面 ...

  10. 《java并发编程实战》读书笔记10--显示锁Lock,轮询、定时、读写锁

    第13章 显示锁 终于看到了这本书的最后一本分,呼呼呼,真不容易.其实说实在的,我不喜欢半途而废,有其开始,就一定要有结束,否则的话就感觉哪里乖乖的. java5.0之前,在协调对共享对象的访问时可以 ...