ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1245E:Hyakugoku and Ladders

2019-11-08 23:53:39  阅读:242  来源: 互联网

标签:Hyakugoku int Ladders maxn CF1245E 回合 梯子


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;
}

标签:Hyakugoku,int,Ladders,maxn,CF1245E,回合,梯子
来源: https://www.cnblogs.com/zxytxdy/p/11823902.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有