博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dtoj#4120. 飞行棋(feixingqi)
阅读量:6209 次
发布时间:2019-06-21

本文共 1177 字,大约阅读时间需要 3 分钟。

题目描述:

小G在玩飞行棋。这个飞行棋与一般的飞行棋相比,规则要简单得多。棋盘上一共有从左到右$n$个格子,按$1$到$n$标号。$m$个玩家各持有一个棋子。棋子第一个到达第$n$格的玩家胜利。每个玩家轮流投掷$6$面的骰子,投出几点就把自己的棋子往右移动几步。当棋子被移动到某些格子时,棋子会被传送到其他格子。如果棋子被移动到第$i$格,若$a_i=i$,则棋子仍然在第$i$格;否则棋子会被传送到第$a_i$格。棋子每次按骰子投出的数字移动时,是一次性移动了若干格,即棋子不会在中途被传送走,只可能在移动完后被传送走。不同玩家的棋子之间互不影响。

现在小G告诉了你$m$个玩家棋子所在位置。现在开始按$1$号玩家到$m$号玩家的顺序依次扔骰子。小G想知道每个玩家获胜的概率。

算法标签:DP

思路:

因为其具有收敛性,所以当你局数足够多时,近似于得到答案。

令状态表示 $f[i][j]$ 表示初始位置在 $j$ 经过 $i$ 局恰好到 $n$ 的概率。依此枚举在某一轮我成功了其余都在我之后成功过的概率,得到答案。

以下代码:

#include
#define il inline#define db double#define _(d) while(d(isdigit(ch=getchar())))using namespace std;const db P=1.0/6.0;const int N=170,M=550000;int n,m,a[N],p[22],op;db f[2][N],g1[M+2][22],g2[M+2][22],g[M+2][22];il int read(){ int x,f=1;char ch; _(!)ch=='-'?f=-1:f;x=ch^48; _()x=(x<<1)+(x<<3)+(ch^48); return f*x;}int main(){ n=read();m=read(); for(int i=1;i<=n;i++)a[i]=read(); for(int i=n+1;i<=n+6;i++)a[i]=n; for(int i=1;i<=m;i++)p[i]=read(); if(m==1){puts("1.000000");return 0;} f[0][n]=1.0; for(int i=1;i<=M;i++){ op^=1; for(int j=1;j<=n;j++)f[op][j]=0; for(int j=1;j
View Code

 

转载于:https://www.cnblogs.com/Jessie-/p/10416064.html

你可能感兴趣的文章
前端工作面试问题(先记录,后面再一一解答)
查看>>
HBASE的Java与Javaweb(采用MVC模式)实现增删改查附带源码
查看>>
初识HTML
查看>>
Android开发之资源文件存储
查看>>
让Spring不再难懂-ioc篇
查看>>
LeetCode----172. Factorial Trailing Zeroes(Java)
查看>>
乱七八糟记一下
查看>>
Python爬虫与一汽项目【二】爬取中国东方电气集中采购平台
查看>>
angular微信支付url未注册
查看>>
django-2-目录结构
查看>>
list去重的几种方法
查看>>
期货开平,多开,空开,多平,空平
查看>>
c# WF 第3节 窗体的属性
查看>>
Eclipse在线安装SVN
查看>>
2、DTO(数据传输对象)
查看>>
dubbo之泛化实现
查看>>
python (winpython) 下载地址
查看>>
MD5加密
查看>>
哈夫曼编码测试
查看>>
flask_web开发这本书的学习笔记
查看>>