传送门

显然这个图是个 $DAG$ ,那么就可以考虑跑 $dp$ 了

先考虑没有梯子的情况,首先把每个位置标号,越后面的位置编号越小,终点位置编号为 $1$

那么从终点往起点 $dp$ ,枚举当前位置摇到的数字,那么有 $f[x]=\frac{\sum_{i=1}^{6}(f[x-i]+1)}{6}$,并且 $f[1]=0$

但是这是在 $x>6$ 的情况下成立的,因为如果 $x<=6$ 那么有可能不走,特殊考虑一下

首先 $f[2]$ ,那么有 $5/6$ 的概率原地不动,$1/6$ 的概率走到终点,即 $f[2]=\frac{5(f[2]+1)}{6}+\frac{f[1]+1}{6}=(\frac{5}{6}+\frac{f[1]+1}{6}) / (1-5/6)$

然后 $f[3]$ 也差不多考虑,$f[3]=\frac{4(f[3]+1)}{6}+\frac{f[1]+1}{6}+\frac{f[2]+1}{6}=(\frac{4}{6}+\frac{f[1]+1}{6}+\frac{f[2]+1}{6}) / (1-4/6)$

发现对于 $x\in [2,6]$ ,$f[x]=\frac{(\sum_{i=1}^{x-1}f[x-i]+1)/6+(7-i)/6}{1-(7-i)/6}$

现在来考虑有梯子的情况,设位置 $x$ 有一个梯子通往位置 $y$ ,那么 $f[x]$ 转移的时候还要考虑瞬移到 $y$ 再走的情况

差不多的转移,取个最小值即可,即和 $\sum_{i=1}^{6}(f[y-i]+1)/6$ 取个最小值,对于 $y<=6$ 的情况同样要特殊处理

看代码就知道具体怎么做了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
typedef double db;
inline int read()
{
int x=,f=; char ch=getchar();
while(ch<''||ch>'') { if(ch=='-') f=-; ch=getchar(); }
while(ch>=''&&ch<='') { x=(x<<)+(x<<)+(ch^); ch=getchar(); }
return x*f;
}
const int n=,N=;
int id[N][N],to[N];
db f[N];
int main()
{
int tot=;
for(int i=;i<=n;i++)
{
if(i&)
for(int j=;j<=n;j++)
id[i][j]=++tot;
else
for(int j=n;j>=;j--)
id[i][j]=++tot;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
int a=read();
if(a) to[id[i][j]]=id[i-a][j];
}
// f[2]=(f[2]+1)*5/6 + 1/6
// f[3]=(f[3]+1)*4/6 + 1/6 + (f[2]+1)/6
for(int i=;i<=;i++)
{
for(int j=;j<i;j++)
f[i]+=(f[i-j]+1.0)/;
f[i]+=(7.0-i)/;
f[i]/=(1.0-(7.0-i)/);
}
for(int i=;i<=tot;i++)
{
for(int j=;j<=;j++)
f[i]+=(f[i-j]+1.0)/;
if(!to[i]) continue;
db mi=; int t=to[i];
if(t==) { f[i]=; continue; }//我这个做法要特判
for(int j=;j<=;j++)
if(t-j>) mi+=(f[t-j]+1.0)/;
if(t<=) mi+=(7.0-t)/,mi/=(1.0-(7.0-t)/);
f[i]=min(f[i],mi);
}
printf("%.10f\n",f[tot]);
return ;
}

最新文章

  1. jQuery系列:选择器
  2. 在SQL Server 2005中连接Oracle,完成查询、插入操作
  3. HttpClient请求
  4. Android 常用抓包工具介绍之Charles
  5. 写essay和research paper必用的17个网站
  6. C++ 基础复习 1
  7. XE5 ANDROID平台 调用 webservice
  8. puppet yum仓库
  9. matlab中元胞数组(cell)转换为矩阵
  10. 一些记录查询的SQL语句
  11. emeditor 配置教程
  12. Vmware虚拟机安装Ubuntu 16.04 LTS(长期支持)版本+VMware tools安装
  13. html的布局demo
  14. 【js】【图片显示】js控制html页面显示图片方式
  15. debug方法
  16. 我的第一个Python程序,定义主函数,eval、format函数详解,
  17. IsNullOrWhiteSpace与IsNullOrEmpty
  18. Python day16 tag式整体退出技巧
  19. JDBC实例--通过连接工具类DBUtil +配置文件来获取连接数据库,方便又快捷
  20. struts2 ValueStack详解,页面获取值el表达式、ognl表达式

热门文章

  1. OpenVirtex安装
  2. Sentinel 快速入门
  3. 通过adb操作安卓亮屏、设置背光亮度、解锁、打开app
  4. uboot自定义添加命令
  5. ISO/IEC 9899:2011 条款6.2.1——标识符的作用域
  6. 007-多线程-JUC集合-Queue-BlockingQueue接口以及ArrayBlockingQueue
  7. CNCF基金会的Certified Kubernetes Administrator认证考试计划
  8. Linux MySql状态、启动、停止、重启命令
  9. 《海会圣贤》高清字幕版(由香港佛陀教育协会发布DVD恭敬转成)
  10. PAT 甲级 1031 Hello World for U (20 分)(一开始没看懂题意)