zoukankan      html  css  js  c++  java
  • 【HDU4405】Aeroplane_chess

    题意

      飞行棋。有n+1格,开始时在0号格子,每一步都要扔一个dice(六个面,概率相同)哪一面朝上他就会向前走x+i步。当x+i大于等于N的时候,游戏结束。另外,地图上有m条航线。第i条航线可以直接从xi到yi。计算扔dice次数的期望。

    分析

      这个题有一个默认的条件,如果当前格子有航线可以选择,那么就一定选择航线而不是掷色子。

      最简单的概率DP,状态的定义需要从后往前定义,因为航线的缘故只能从后往前转移。

      定义f[i]为 从第i个格子到n个格子的期望次数是多少。

      如果i格子有航线那么 f[i]=f[to] ,to是航线可以到达的格子。

      如果i格子没有航线,那么f[i]=sum(1/6*f[i+k])+1,其中k是色子的六个面(1,2,3,4,5,6)。

      code

      

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <iostream>
     5 
     6 using namespace std;
     7 const int maxn=100000+100;
     8 int n,m;
     9 int line[maxn];
    10 double f[maxn];
    11 int main(){
    12     while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){
    13         memset(f,0,sizeof(f));
    14         memset(line,-1,sizeof(line));
    15 
    16         int x,y;
    17         for(int i=1;i<=m;i++){
    18             scanf("%d%d",&x,&y);
    19             line[x]=y;
    20         }
    21         for(int i=n-1;i>=0;i--){
    22             if(line[i]!=-1){
    23                 f[i]=f[line[i]];
    24             }
    25             else{
    26                 for(int j=1;j<=6;j++){
    27                     int to=min(n,i+j);
    28                     f[i]+=(f[to]+1)*(double)1/6;
    29                 }
    30 
    31             }
    32         }
    33        /* for(int i=0;i<=n;i++){
    34             printf("%d %.4f
    ",i,f[i]);
    35         }*/
    36         printf("%.4f
    ",f[0]);
    37     }
    38 return 0;
    39 }
    View Code
  • 相关阅读:
    Golang的安装包方法
    Debian kvm网络配置
    Debian-Linux配置网卡网络方法
    KVM虚拟机网络配置 Bridge方式,NAT方式
    WebRTC之框架与接口
    WebRTC
    关于golang.org/x包问题
    http内网转发
    linux服务器可以访问IP访问不了域名地址
    golang--生成某区间的随机数
  • 原文地址:https://www.cnblogs.com/LQLlulu/p/9084480.html
Copyright © 2011-2022 走看看