做的第一道 概率DP求期望的题。
并且去看了一些期望的总结。 大体也就是 对于一个目标状态。 倒着往出状态推。 并且设 目标状态的 期望为0. 那么根据状态转移方程
一般就可以求出后继的状态了。( 这些都是 无环的)
对于这个题亦是如此。 目标位置是en。 那么 dp【en】 = 0;
对于位置 i 对于 能够直接到达 i 的点。 期望是相等的。
否则 dp【i】 = (dp【i+j】+1)/6 (1<=j<=6);
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
#define MAXN 100000 + 10
double dp[MAXN] = {0};
int used[MAXN] = {0};
vector <int> q[MAXN];
int main (){
int en,n;
while(scanf("%d%d",&en,&n) != EOF){
if(en == 0 && n == 0)
break;
memset(dp,0,sizeof(dp));
memset(used,0,sizeof(used));
for(int i = 0; i <= en; i++)
q[i].clear();
for(int i = 0; i < n; i++){
int from,to;
scanf("%d%d",&from,&to);
q[to].push_back(from);
}
for(int i = 0; i < q[en].size(); i++){
dp[q[en][i]] = 0;
used[q[en][i]] = 1;
}
for(int i = en-1; i >= 0; i--){
if(!used[i]){
used[i] = 1;
for(int j = i+1; j <= i+6; j++){
dp[i] += (dp[j]+1)/6;
}
}
for(int j = 0; j < q[i].size(); j++){
dp[q[i][j]] = dp[i];
used[q[i][j]] = 1;
}
}
printf("%.4lf\n",dp[0]);
}
return 0;
}