zoukankan      html  css  js  c++  java
  • hdu 4405 Aeroplane chess (概率dp)

    /*
    题目大意:
    问从0到n所花费时间平均时间。每次有投骰子。投到几就走几步。当然了,还有近道。

    题目分析: 如果如今在i,那么接下来有六种可能的走法,各自是: i到i+1,在由i+1到结束 i到i+2,在由i+2到结束 i到i+3,在由i+3到结束 i到i+4,在由i+4到结束 i到i+5,在由i+5到结束 i到i+6,在由i+6到结束 当中每个可能的走法发生的概率为n为1/6。那么最好还是定义dp(i),表示从i走到结束的期望。

    那么有以下的等式: dp(i-1) = sum((dp((i-1)+j)+1)*p) 当中j ∈[0,6]。 当(i-1)+j >= n时。仅仅须要时间1就能够结束。

    当有近道(i,j)时,能够直接跳过去。

    dp(i)=dp(j)。 */ # include <stdio.h> # include <algorithm> # include <string.h> # include <iostream> using namespace std; int n; double dp[100010]; int h[100010]; void slove() { memset(dp,0,sizeof(dp)); for(int i=n; i>=1; i--) { double p=1.0/6.0;//骰子概率 for(int j=1; j<=6; j++) { int id=h[i-1]; if(id!=-1)//直接过来,不用掷骰子 dp[i-1]=dp[id]; else { if((i-1)+j>=n) dp[i-1]+=p; else dp[i-1]+=(dp[(i-1)+j]+1)*p; } } } } int main() { int m,a,b; while(~scanf("%d%d",&n,&m),n+m) { memset(h,-1,sizeof(h)); while(m--) { scanf("%d%d",&a,&b); h[a]=b; } slove(); printf("%.4lf ",dp[0]); } return 0; }


  • 相关阅读:
    [编程题] 数组中的重复数字
    Redis数据结构之集合命令
    Redis数据结构之字符串命令
    Docker安装mysql
    后缀数组与字符串匹配
    牛客小白月赛11 Rinne Loves Edges
    牛客小白月赛11 Rinne Loves Xor
    牛客练习赛39 B.选点
    欧拉函数
    51 Nod 1700 首尾排序法
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7053649.html
Copyright © 2011-2022 走看看