hdu 4405 概率dp 求期望

来源:互联网 发布:如何成为淘宝达人步骤 编辑:程序博客网 时间:2024/06/09 14:47

所谓期望,就是平均值。

题意:飞行棋,从0到n,置骰子,置到几就往前走几步,前进中会有捷径,比如2和5连到一起了,那你走到2时可以直接跳到5,如果5和8连到一起了,那你还可以继续跳到8.

最后问跳到n时平均置几次骰子。也就是求期望。

状态方程很好推  从后往前,i点的期望为六种情况和+1。但是有一点需要注意:如果当前i点再加上你的骰子数大于n了,那么这个就不能加了。


#include<stdio.h>#include<string.h>#include<algorithm>#include<cmath>using namespace std;int n,m,pre[100100];double dp[100100];int main(){while(scanf("%d%d",&n,&m)&&(n+m)){for(int i=0;i<=n;i++){pre[i]=-1;}for(int i=1;i<=m;i++){int xi,yi;scanf("%d%d",&xi,&yi);pre[xi]=yi;}dp[n]=0;for(int i=n-1;i>=0;i--){dp[i]=0;if(pre[i]!=-1){dp[i]=dp[pre[i]];}else{for(int j=1;j<=6;j++){if(i+j<=n){dp[i]+=dp[i+j]*(1/6.0);}else break;}dp[i]+=1;}}printf("%.4lf\n",dp[0]);}return 0;}