zoukankan      html  css  js  c++  java
  • HDU4405

    Hzz非常喜欢飞机象棋。象棋地图包含N+1个从0到N的网格。Hzz从网格0开始。他每走一步就掷一个骰子(一个骰子有六个面,面朝上的概率相等,面上的数字是1、2、3、4、5、6)。当Hzz在第一格且骰子数为x时,他将移动到第一格+x。当i+x等于或大于N时,Hzz结束游戏。

     

    国际象棋地图上还有M条航线。第i条飞行线可以帮助Hzz从网格Xi飞到Yi(0<Xi<Yi<=N),而无需掷骰子。如果有另一条来自易的航线,Hzz可以连续乘坐该航线。允许没有两条或两条以上的航线从同一网格开始。

     ______________________________________

    f[i]:从i点走到重点要掷骨子几次

    f[i]=(f[i+1]+f[i+2]+f[i+3]+f[i+4]+f[i+5]+f[i+6])/6+1

    注意飞行线,如果u可以到v而v更大,那么f[u]=f[v]

    ______________________________________

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e5+20;
     4 int nxt[maxn];
     5 double f[maxn];
     6 int n,m;
     7 
     8 int main()
     9 {
    10     while(scanf("%d%d",&n,&m)==2&&(n||m))
    11     {
    12         memset(nxt,-1,sizeof nxt);
    13         memset(f,0,sizeof f);
    14         for(int u,v,i=1;i<=m;++i)
    15         {
    16             scanf("%d%d",&u,&v);
    17             nxt[u]=v;
    18         }
    19         for(int i=n-1;i>=0;i--)
    20         {
    21             if(nxt[i]!=-1)
    22             {
    23                 f[i]=f[nxt[i]];
    24                 continue;
    25             }
    26             double tp=0;
    27             for(int j=1;j<=6;++j)tp+=f[i+j];
    28             f[i]=tp/6+1;
    29         }
    30         printf("%.4lf
    ",f[0]);
    31     }
    32     return 0;
    33 }
    View Code
  • 相关阅读:
    CF733F
    P4826
    洛谷P2687 & P1108
    CF42A
    洛谷P1858
    CF1428C
    洛谷P4981
    树形DP
    背包六讲(也不知道为啥就是六个 $QwQ$)
    2020
  • 原文地址:https://www.cnblogs.com/gryzy/p/14425268.html
Copyright © 2011-2022 走看看