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;
}