开始把dp[i] 设成了 从0到>=i的期望值。。。。然后差点跪了。。。确实是个水题。。不过头脑灵活一下。
思路:设dp[i] 为从i到>=n的期望值。
如果i有航班,dp[i] = dp[mark[i]];
如果有航班,dp[i] = sigma(dp[i+j]) / 6 + 1 ( 1<= j <=6)
代码:
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 100050;
double dp[maxn];
int mark[maxn];
int n,m;
void init(){
dp[0] = 0;
fill(mark,mark+maxn,-1);
fill(dp,dp+maxn,0);
}
int main(){
while(~scanf("%d%d",&n,&m)){
if(n + m == 0) break;
init();
int a,b;
while(m--){
scanf("%d%d",&a,&b);
mark[a] = b;
}
for(int i=n-1;i>=0;i--){
if(mark[i] != -1) dp[i] = dp[mark[i]];
else{
double tmp = 0;
for(int j=1;j<=6;j++) tmp += dp[i+j];
dp[i] = tmp / 6 + 1;
}
}
printf("%.4f\n",dp[0]);
}
return 0;
}