hdu 4405 Aeroplane chess 概率dp入门题
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. Input There are multiple test cases. 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
Sample Output
|
题目大意:有n+1个格子排成一排,编号从0到n,并且在某些格子能直接跳到某个格子。
现在掷骰子,掷到多少就走几步,求掷骰子次数的期望。
期望:$E(x) = \sum {p_i*x_i}$
定义dp[i]是从i到达终点的掷骰子期望次数,那么$$dp[i] = \sum_{j=1}^6 {(dp[i+j]+1)/6}$$。
#include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; const int maxn = 100010; int jump[maxn]; double dp[maxn]; int main() { int n,m,a,b; while(scanf("%d%d",&n,&m)!=EOF&&n) { memset(jump,0,sizeof(jump)); memset(dp,0,sizeof(dp)); while(m--) { scanf("%d%d",&a,&b); jump[a] = b; } dp[n] = 0; for(int i=n-1;i>=0;i--) { if(jump[i]) dp[i] = dp[jump[i]]; else for(int j=1;j<=6;j++) { dp[i] += (dp[i+j]+1)/6; } } printf("%.4f\n",dp[0]); } }