InputThere are multiple test cases. Each test case contains several lines. The first line contains two integers N(1≤N≤100000) and M(0≤M≤1000). Then M lines follow, each line contains two integers Xi,Yi(1≤Xi<Yi≤N). The input end with N=0, M=0. OutputFor each test case in the input, you should output a line indicating the expected dice throwing times. Output should be rounded to 4 digits after decimal point. Sample Input
2 0 8 3 2 4 4 5 7 8 0 0Sample Output
1.1667 2.3441飞行棋求步数期望。逆推求期望典型。dp[i]下标状态为所在位置,值为步数。 n=3,m=0 e[3]=0 e[2]=1/6e[3]+1 e[1]=1/6e[2]+1/6e[3]+1 e[0]=1/6e[1]+1/6e[2]+1/6e[3]+1 #include<bits/stdc++.h> #define MAX 100010 using namespace std; typedef long long ll; int f[MAX]; double dp[MAX]; int main() { int t,n,m,i,j; int x,y; while(scanf("%d%d",&n,&m)&&n+m){ memset(f,-1,sizeof(f)); memset(dp,0,sizeof(dp)); for(i=1;i<=m;i++){ scanf("%d%d",&x,&y); f[x]=y; } dp[n]=0; for(i=n-1;i>=0;i--){ if(f[i]>-1){ dp[i]+=dp[f[i]]; } else{ for(j=1;j<=6;j++){ if(i+j>n) break; dp[i]+=1.0/6*dp[i+j]; } dp[i]++; } } printf("%.4f\n",dp[0]); } return 0; }
转载于:https://www.cnblogs.com/yzm10/p/9678088.html
