hdu 4405 Aeroplane chess(期望)

http://acm.hdu.edu.cn/showproblem.php?pid=4405


有n+1个点,0~n ,某人现在站在x处,若x处有flight lines,他就能飞到相应点而不用掷骰子,否则就向前走掷出的骰子上的数字。问他从0点到达n点需要投掷骰子的平均次数。


还是一样的题型,已知dp[n] = 0,然后根据当前点能到达的下一点的概率进行逆推。dp[0]就是答案。


#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
//#define LL __int64
#define LL long long
#define eps 1e-9
#define PI acos(-1.0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 4010;

double dp[100010];
int hash[100010];

int main()
{
    int n,m,u,v;
    while(~scanf("%d %d",&n,&m))
    {
        if(n == 0 && m == 0)
            break;
        memset(dp,0,sizeof(dp));
        memset(hash,-1,sizeof(hash));
        while(m--)
        {
            scanf("%d %d",&u,&v);
            hash[u] = v;
        }
        for(int i = n; i >= 0; i--)
        {
            if(i == n) continue;
			if(hash[i] == -1)
            {
            	for(int j = i+1; j <= i+6; j++)
						dp[i] += dp[j];
				dp[i] /= 6;
				dp[i] += 1;
            }
			else
				dp[i] = dp[hash[i]];
        }
        printf("%.4lf\n",dp[0]);
    }
    return 0;
}


你可能感兴趣的:(概率DP)