CF1245E:Hyakugoku and Ladders

CF1245E:Hyakugoku and Ladders

题意描述:

  • 给你一个\(10*10\)的矩阵,矩阵描述如下

    • 最开始的时候你在左下角,你的目标是到达左上角。
    • 你可以走路径或者爬梯子。
    • 路径的定义:
      • 如果当前在一行的最右边,你可以网上爬一格。
      • 如果在行内其他位置,你可以往旁边走。
    • 每一回合你都要掷一个六面的骰子,假设当前骰子的正面为\(r\)。如果到终点的距离小于\(r\),那么你将不能移动。否则你将移动\(r\)格,如果你最后移动到的位置有一个梯子,你可以选择爬上去或者不怕上去。
  • 你的目标是找到到达目的的回合的最小期望。

思路:

  • 期望\(dp\)。
  • 在二维上不是很方便,我们可以把二维看成一个一维数组。
  • \(f(i)\)表示到\(i\)需要多少回合。如果没有梯子的限制,那么有状态转移方程:
    • \(f(i)=\frac{f(i-1)+f(i-2)+...+f(i-6)}{6}+1\)
  • 那么有了梯子,我们只需要针对梯子转移过来的情况取\(min\)即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 15;
int g[maxn][maxn];
int nex[maxn][maxn];
int a[maxn*maxn];
double f[maxn*maxn];
int main()
{
    for(int i = 1; i <= 10; i++)
        for(int j = 1; j <= 10; j++)
            nex[i][j] = (i-1)*10 + (i&1 ? j : 11-j);

    for(int i = 1; i <= 10; i++)
        for(int j = 1, x; j <= 10; j++){
            scanf("%d", &x);
            a[nex[i][j]] = nex[i-x][j];
        }

    f[1] = 0;
    double sum = 0;
    for(int i = 2; i <= 6; i++)
        f[i] = (sum+6) / (i-1), sum += f[i];

    for(int i = 7; i <= 100; i++)
    {
        sum = 0;
        for(int r = 1; r <= 6; r++)
            sum = sum + min(f[i-r], f[a[i-r]]);
        f[i] = sum / 6.0 + 1;
    }

    printf("%.10f", f[100]);
    return 0;
}

原文地址:https://www.cnblogs.com/zxytxdy/p/11823902.html

时间: 2024-08-30 18:22:01

CF1245E:Hyakugoku and Ladders的相关文章

Codeforces Round #597 (Div. 2) E. Hyakugoku and Ladders 概率dp

E. Hyakugoku and Ladders Hyakugoku has just retired from being the resident deity of the South Black Snail Temple in order to pursue her dream of becoming a cartoonist. She spent six months in that temple just playing "Cat's Cradle" so now she w

并不对劲的CF1245E&amp;F:Cleaning Ladders

CF1245 E. Hyakugoku and Ladders 题目大意 有一个10 \(\times\) 10的网格,你要按这样的路径行走: 网格中有一些单向传送门,每个传送门连接的两个格子在同一列.传送门的方向一定是从下往上的,而且每个格子的出度至多为1,最上面一行的格子没有出去的传送门. 你的行走步骤是这样: 1.抛一枚六面骰子,如果往前走点数步不会走超过终点就往前走点数步,反之站着不动并且跳过第二步: 2.如果这一点有传送门,可以选择进传送门或不进. 在恰好走到终点上之前,你会不断重复以

Oracle 11g数据库详解(2015-02-28更新)

Oracle 11g数据库详解 整理者:高压锅 QQ:280604597 Email:[email protected] 大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的 1   简介 数据库操作主要有以下几步: 1.  启动.停止数据库 2.  连接.断开数据库 3.  创建.修改.删除数据库用户 4.  表空间 5.  新建.修改.删除表 6.  查询.插入.修改.删除表数据 7.  新建.修改.删除视图 8.  新建.修改.删除存储过程 9.  新建.修改.删除触发

POJ - 2564 Edit Step Ladders

题意:题目按字典序给你多个字符串,判断如果一个字符串通过加,减,变一个字母的情况下可以变成另一个字符串的话,就代表他们之间有一个阶梯,求最多的阶梯 思路:首先我们应该想到这个有点LIS的感觉,然后我们可以采用记忆化搜索,然后就是每当一个字符串进行相应的变化后就去查找后面是否有这个字符串,依次找下去,判断最大值,重点是要通过HASH来优化 #include <iostream> #include <cstdio> #include <cstring> #include &

UVA10029 - Edit Step Ladders(LIS)

题目大意:UVA10029 - Edit Step Ladders(LIS) 题目大意:给你一个按照字典序读入的单词,然后要求你找出最长的序列,要求这个最长的序列也要满足字典序,并且后一个是由前一个单词,由在任意的地方替换,增加,删除一个字符变换来的. 解题思路:LIS.但是这里的O(n^2) 25000,超时.但是查找符合的单词有个规律,符合变换要求的单词的长度是有要求的,必须相差小于等于1.并且数据中相同长度的单词不会超过45个,那么就可以把这些单词按照长度分类,那么查找的时候就是45 *

UVA - 10029 Edit Step Ladders (二分+hash)

Description Problem C: Edit Step Ladders An edit step is a transformation from one word x to another word y such that x and y are words in the dictionary, and x can be transformed to y by adding, deleting, or changing one letter. So the transformatio

Snakes and Ladders LightOJ - 1151

'Snakes and Ladders' or 'Shap-Ludu' is a game commonly played in Bangladesh. The game is so common that it would be tough to find a person who hasn't played it. But those who haven't played it (unlucky of course!) the rules are as follows. There is a

UVA10566 Crossed Ladders (数学+二分)

UVA10566 Crossed Ladders Description如图1,多组数据,输入x,y,c,求出t的大小,保留三位小数 Hint由相似三角形的知识,我们用两种方法分别表示出图中Lx,就可以得出一个等式关系:$$\frac{1}{b}+\frac{1}{a}=\frac{1}{c} ??(1)$$又有等式$$a=\sqrt{x^2-t^2},b=\sqrt{y^2-t^2}$$把这两式代入(1)式可以得到$$\frac{1}{\sqrt{x^2-t^2}}+\frac{1}{\sqr

安装Windows7系统时,提示:缺少所需的CD/DVD驱动器设备驱动程序

      测试机型:HP probook 430 g3       系统:Windows 7 Pro x64 现在笔记本电脑主板集成的USB口大多为3.0版本,而且一些厂商为了追求PC的轻薄,不再集成光驱,所以我们在安装系统时,一般只能通过U盘或U口外接光驱. 而当我们因为需要(安装OEM系统),在通过刻录软件(如UltraISO)将系统写入U盘或光盘的方式安装系统时,此时问题就可能悄悄出现了:因为Win7官方原版系统没有集成USB3.0驱动,所以可能的报错如下: 点击"浏览"或通过