[bzoj4832]抵制克苏恩 概率dp
来源:互联网 发布:三维人像建模软件 编辑:程序博客网 时间:2024/05/29 15:10
考试的时候打了个搜索,时间比较短,样例又非常的弱,实在不太清楚他这个到底是什么意思。
不过lc大神好腻害,讲解了一下非常的清楚了。
f[i][j][k][l]表示第i次伤害(啊),一滴血j个,两滴血k个,三滴血l个的概率。
初始状态f[1][a][b][c]=1
转移状态
1.此次攻击英雄 f[i+1][j][k][l]
2.攻击一个血量为1的仆从→ f[i+1][j-1][k][l]
3.攻击一个血量为2的仆从→ f[i+1][j+1][k-1][l]//超过7个仆从 f[i+1][j+1][k-1][l+1]//不超过7个
4.攻击一个血量为3的仆从→ f[i+1][j][k+1][l-1]//超过7个仆从 f[i+1][j][k+1][l]//不超过7个
那么最后答案应为Σf[i][j][k][l]*1.0*1/(j+k+l+1)
注意:转移时候要看清转移概率的人数。
#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define pos(i,a,b) for(int i=(a);i<=(b);i++)#define N 60double f[N][N][N][N],ans;int n,a,b,c;int t;int main(){ scanf("%d",&t); while(t--){ memset(f,0,sizeof(f)); scanf("%d%d%d%d",&n,&a,&b,&c); ans=0; f[1][a][b][c]=1; pos(i,1,n){ pos(j,0,7){ pos(k,0,7){ pos(l,0,7){ if(l+j+k<=7){ f[i][j][k][l]+=f[i-1][j][k][l]*(double)1/(j+k+l+1); f[i][j][k][l]+=f[i-1][j+1][k][l]*(double)(j+1)/(j+k+l+2); if(j!=0) { if((j+k+l)==7) f[i][j][k][l]+=f[i-1][j-1][k+1][l]*(double)(k+1)/(j+k+l+1); f[i][j][k][l]+=f[i-1][j-1][k+1][l-1]*(double)(k+1)/(j+k+l); } if(k!=0) { if((j+k+l)==7) f[i][j][k][l]+=f[i-1][j][k-1][l+1]*(double)(l+1)/(j+k+l+1); f[i][j][k][l]+=f[i-1][j][k-1][l]*(double)l/(j+k+l); } } } } } } pos(i,1,n) pos(j,0,7) pos(k,0,7) pos(l,0,7) if((l+j+k)<=7) ans+=f[i][j][k][l]*(double)1/(j+k+l+1); printf("%0.2lf\n",ans); } return 0;}
阅读全文
1 0
- [bzoj4832]抵制克苏恩 概率dp
- [BZOJ4832]抵制克苏恩(概率期望dp)
- bzoj4832: 抵制克苏恩
- [bzoj4832]抵制克苏恩
- bzoj 4832 抵制克苏恩 概率期望dp
- BZOJ4832 [Lydsy2017年4月月赛]抵制克苏恩
- bzoj 4832: 抵制克苏恩 (概率与期望DP)
- 概率DP [Lydsy2017年4月月赛]抵制克苏恩
- [BZOJ]4832 抵制克苏恩 期望dp
- 概率dp
- ##概率dp##
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- 概率dp
- Java基础
- static(静态)变量
- C#和C++中类实例化的差异——从C#到C++爬坑ing
- 题目1490:字符串链接
- MyBatis基本操作
- [bzoj4832]抵制克苏恩 概率dp
- 文本压缩过滤器实现
- Linux账号与身份管理
- 常见排序算法整理(三)----归并排序、快速排序
- Java NIO流--二
- Linux shell脚本的字符串截取
- 常用开发git指令总结 欢迎补充
- Catch That Cow
- I/O多路转接(三)——epoll函数