HDU 4405 Aeroplane chess (概率dp)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4405


题意:这是一个飞行棋游戏。棋盘上有 n+1(1<=n<=100000) 个格子,编号从 0 到 n,起始点是 0,如果走到了 n 或者比 n 大的地方,游戏结束。每轮游戏掷一枚骰子,骰子六个面(1,2,...,6)出现的几率相等。有些格子 i 可能会通过飞机传送到 j(i<j)。
现在问玩完一局飞行棋需要掷骰子的次数的期望值是多少?


AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <iterator>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <cctype>
#include <ctime>
using namespace std;

typedef __int64 LL;
const int N=100009;
const double eps=1e-6;
const int M=1<<12;
const LL mod=1000000007;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);

double dp[N];
int next[N];

int main()
{
    int i,j,n,m;
    while(scanf("%d%d",&n,&m)&&(n+m))
    {
        memset(next,0,sizeof(next));
        memset(dp,0,sizeof(dp));
        for(i=0;i<m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            next[a]=b;
        }
        for(i=n-1;i>=0;i--)
        {
            if(next[i]==0)
            {
                dp[i]=1.0/6.0*(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])+1;
            }
            else
                dp[i]=dp[next[i]];
        }
        printf("%.4f\n",dp[0]);
    }
    return 0;
}

/*
令:f[x] 表示在 x 这个格子中,距离游戏结束掷骰子的期望值。
于是,我们有:
当 x 这个位子没有传送飞机时:f[x] = 1 + segma{ f[x+i]*1.0/6.0 },i=1,2,...,6
当 x 这个位子有传送飞机,假设传送到 next[x],那么: f[x] = f[next[x]]
*/


你可能感兴趣的:(HDU 4405 Aeroplane chess (概率dp))