程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 4405 Aeroplane chess (概率DP+求期望)

hdu 4405 Aeroplane chess (概率DP+求期望)

編輯:C++入門知識

hdu 4405 Aeroplane chess (概率DP+求期望)


Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1551 Accepted Submission(s): 1063


Problem Description Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz starts at grid 0. For each step he throws a dice(a dice have six faces with equal probability to face up and the numbers on the faces are 1,2,3,4,5,6). When Hzz is at grid i and the dice number is x, he will moves to grid i+x. Hzz finishes the game when i+x is equal to or greater than N.

There are also M flight lines on the chess map. The i-th flight line can help Hzz fly from grid Xi to Yi (0
Please help Hzz calculate the expected dice throwing times to finish the game.

Input There are multiple test cases.
Each test case contains several lines.
The first line contains two integers N(1≤N≤100000) and M(0≤M≤1000).
Then M lines follow, each line contains two integers Xi,Yi(1≤Xi The input end with N=0, M=0.

Output For each test case in the input, you should output a line indicating the expected dice throwing times. Output should be rounded to 4 digits after decimal point.

Sample Input
2 0
8 3
2 4
4 5
7 8
0 0

Sample Output
1.1667
2.3441


題意:有n個格子,擲色子的擲出的數目就是你一次到移動格數。其中有m個飛行通道可以讓你直接從第xi格

飛到第yi格。問你走到終點的期望是多少。


思路: dp[i] 表示 當前在第i格走到終點的期望。

當i不是飛行通道的起點時: dp[i] =1.0+ (dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6.0;

當i是飛行通道的起點時: dp[Xi] = dp[Yi] (因為Xi可直接到Yi,並且不需要擲色子);


#include 
#include 
#include 
using namespace std;
const int N=100050;

int n,m,mark,x,y,pre[N];
double dp[N];

void input()
{
    memset(pre,-1,sizeof(pre));
    for(int i=0; i=0;i--)
    {
        if(pre[i]!=-1)  dp[i]=dp[pre[i]];
        else
        {
             for(int j=1;j<=6;j++)   dp[i]+=dp[i+j];
             dp[i]=dp[i]/6.0+1.0;
        }
    }
    printf("%.4lf\n",dp[0]);
}

int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        if(n==0 && m==0)  break;
        input();
        solve();
    }
    return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved