题意:走飞行棋,从0开始,每次走骰子扔到的点数,当n>=N时停止,有些格子还有桥,如x到y的桥,则x可以直接到y(不扔骰子),m条桥,n+1格格子,问扔骰子的平均次数?
dp[i]表示i点跳到目标状态的期望步数
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
#include<vector>
using namespace std;
#define N 100010
double dp[N];
int map[N];
int main()
{
int i,j,n,m,x,y;
while(scanf("%d%d",&n,&m)&&(m+n))
{
memset(map,-1,sizeof(map));
for(i=0; i<m; i++)
{
scanf("%d%d",&x,&y);
map[x]=y;
}
memset(dp,0,sizeof(dp));
for(i=n-1; i>=0; i--)
{
if(map[i]>=0)
dp[i]=dp[map[i]];
else
for(j=1; j<=6; j++)
dp[i]+=(dp[i+j]+1)*1.0/6.0;
}
printf("%.4lf\n",dp[0]);
}
return 0;
}