题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405、
题目意思:数轴上有N+1个点(编号0~N),一个人玩游戏,从0出发,当到达N或大于N的点则游戏结束。每次行动掷骰子一次,骰子编号1-6,掷到多少就向前走几步,这个数轴上还有些特殊点,这些点类似飞行棋中的飞行点,只要到达这些点就可以直接飞到给定点。求总共投掷骰子次数的期望。
思路:dp从后往前保存就行了,具体看代码
代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define fuck(x) cout<<"<"<<x<<">"<<endl
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
int n,m;
double dp[maxn];
int to[maxn];
int main() {
while (~scanf ("%d%d",&n,&m)&&n){
memset(dp,0,sizeof(dp));
memset(to,0,sizeof(to));
while (m--){
int u,v;
scanf ("%d%d",&u,&v);
to[u]=v;
}
for (int i=n-1;i>=0;i--){
if (to[i]) dp[i]=dp[to[i]];
else {
double tmp=0;
for (int j=i+1;j<=i+6;j++) tmp+=dp[j];
dp[i]=1+tmp/6;
}
}
printf ("%.4lf\n",dp[0]);
}
return 0;
}