题目大意:玩一种飞行棋,从0开始走到n,根据扔骰子的点数向右走,但是其中可能存在通道,即直接传送到另一个位置,问掷骰子的期望次数。
e[i]代表在i位置的期望
DP求解,若遇到通道则俩期望相等
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100010
#define M 1005
double e[N];
int flight[N];
int n,m;
double DP(int k){
if(k>=n) return 0;
if(e[k]) return e[k];
if(flight[k]) return e[k]=DP(flight[k]);
int i,j;
e[k]=0;
for(i=1;i<7;i++){
e[k]+=1.0/6*(1+DP(k+i));
}
return e[k];
}
int main(){
int i,j,from,to;
while(scanf("%d %d",&n,&m)!=EOF&&n+m){
memset(e,0,sizeof(e));
memset(flight,0,sizeof(flight));
for(i=0;i<m;i++){
scanf("%d %d",&from,&to);
flight[from]=to;
}
printf("%.4lf\n",DP(0));
}
return 0;
}