解题思路:
貌似题意是有捷径就走捷径。
那就是裸的期望dp了。
设dp[i]为当前所处位置到目标状态的期望,则当
i≥n
,dp[i]=0。
转移方程为:
有捷径:
dp[i]=dp[to[i]]
没有捷径:
dp[i]=∑dp[i+j]6+1,1≤j≤6
。
最后dp[0]即为答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;
int getint()
{
int i=0,f=1;char c;
for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());
if(c=='-')f=-1,c=getchar();
for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';
return i*f;
}
const int N=100005;
int n,m,to[N];
double dp[N];
int main()
{
//freopen("lx.in","r",stdin);
int x,y;
while(n=getint())
{
memset(dp,0,sizeof(dp));
memset(to,0,sizeof(to));
if(!n)break;
m=getint();
while(m--)
{
x=getint(),y=getint();
to[x]=y;
}
for(int i=n-1;i>=0;i--)
{
if(to[i])dp[i]=dp[to[i]];
else
{
for(int j=1;j<=6;j++)
dp[i]+=dp[i+j];
dp[i]=dp[i]*1.0/6+1;
}
}
printf("%.4lf\n",dp[0]);
}
return 0;
}