zoukankan      html  css  js  c++  java
  • HDU 4405 Aeroplane chess(概率dp,数学期望)

    题目

    http://kicd.blog.163.com/blog/static/126961911200910168335852/

    根据里面的例子,就可以很简单的写出来了,虽然我现在还是不是很理解为什么“是下一分钟,故要加上1.”?

    好吧,先写着,有事没事想一想,也许时间长了就明白了。

    别的人解释很棒:(虽然我还没全懂)


    //e[i]表示i的位置走到n所需要的期望步数
    //那么e[i]怎么求,首先e[i]走到e[i+1]的概率为1/6 ,
    //而e[i+1]是走到终点的期望步数,所以e[i]=e[i+1]*1/6+1,
    //为什么加一呢,因为你向前走了一步,期望表示的是步数
    //以此类推 e[i]=1+e[i+1]*1/6+e[i+2]*1/6+e[i+3]*1/6...+e[i+6]*1/6

    //CF 417
    
    //e[i]表示i的位置走到n所需要的期望步数
    //那么e[i]怎么求,首先e[i]走到e[i+1]的概率为1/6 ,
    //而e[i+1]是走到终点的期望步数,所以e[i]=e[i+1]*1/6+1,
    //为什么加一呢,因为你向前走了一步,期望表示的是步数
    //以此类推 e[i]=1+e[i+1]*1/6+e[i+2]*1/6+e[i+3]*1/6...+e[i+6]*1/6
    
    
    #include <stdio.h>
    #include <string.h>
    #include<algorithm>
    #include<string>
    using namespace std;
    int mp[100010];
    double e[100010];
    int main()
    {
        
        int n,m;
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            if(n==0&&m==0)break;
            memset(mp,0,sizeof(mp));
            for(int i=0;i<m;i++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                mp[x]=y;
            }
            memset(e,0,sizeof(e));
            for(int i=n-1;i>=0;i--)//因为e[n]=0,所以不用再处理它了
            {
                if(mp[i])e[i]=e[mp[i]];
                else
                {
                    for(int j=1;j<=6;j++)
                        e[i]+=(1.0/6.0*e[i+j]);
                    e[i]+=1.0;
                }
            }
            printf("%.4lf
    ",e[0]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/laiba2004/p/3959879.html
Copyright © 2011-2022 走看看