题目传送门
在这里%ZBW大佬
显然这道题看起来很水,虽然对于我这种菜来说也不是特别的水,显然如果可以直接飞过去的话那么dp[i]=dp[j] ( i 可以直接飞到 j )
既然是做期望DP题,我们一般倒推,这道题也是可以倒推的,我们推到一个数,如果可以跳转的话,我们就直接跳转赋DP值,如果不行的话我们就枚举6种情况,然后去从dp[i+j]*P[转移]转移过来,其中j的取值范围是1到6,显然这样就可以了,最后输出dp[0]表示现在在第一个位置,然后赢得平均期望次数是多少就可以了
#include<iostream>
#include<cstdio>
#include<cstring>
double dp[100005];
int vis[100005],from,to;
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF&&(!(n==0&&m==0))){
memset(vis,-1,sizeof(vis));
for(register int i=1;i<=m;i++){
scanf("%d%d",&from,&to);vis[from]=to;
}
memset(dp,0,sizeof(dp));
for(register int i=n-1;i>=0;i--){
if(vis[i]!=-1) dp[i]=dp[vis[i]];
else{
for(register int j=1;j<=6;j++) dp[i]+=dp[i+j]/6.0;
dp[i]+=1;
}
}
printf("%.4lf\n",dp[0]);
}
return 0;
}