HDU 4405 Aeroplane chess
题意: 有 0到 n 个格子,掷骰子走路,求出到终点的数学期望,有飞行的路线。
分析: 求出用 dp[x] 表示走到 x 这个位置的数学期望假如 x 能到达 6 个格子x1,x2,..x6,那么dp[x]中x 格子的期望就是它到6个格子的概率
分别乘以6个格子的期望,因为是从后往前推的,所以x1...x6的期望已经知道了 x 的期望也就能知道了,然后再 +1 因为要多走一步。
分别乘以6个格子的期望,因为是从后往前推的,所以x1...x6的期望已经知道了 x 的期望也就能知道了,然后再 +1 因为要多走一步。
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) #define maxn 100005 struct node { int to,next; }e[100005]; int tot; int head[maxn]; void add(int s,int t) { e[tot].to=t; e[tot].next=head[s]; head[s]=tot++; } double E[maxn]; int v[maxn]; int main() { int n,m,i,j; while(scanf("%d%d",&n,&m),n||m) { tot=1; clr(head); while(m--) { int a,b; scanf("%d%d",&a,&b); add(b,a); } clr(E); clr(v); E[n]=-1; for(i=n;i>=0;i--) { if(!v[i]) { v[i]=1; E[i]+=1; for(j=1;j<=6;j++) E[i]+=E[i+j]*(1.0/6.0); } for(j=head[i];j;j=e[j].next) { E[e[j].to]=E[i]; v[e[j].to]=1; } } printf("%.4lf\n",E[0]); } return 0; }