hdu4405 概率dp
飞行棋游戏 问从0结束游戏的投色子次数期望是多少
设dp[i]表示i到n的期望,那么可以得到dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6+1,另外注意飞行航道和处理离终点6以内的特殊点。
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int maxn=100010; const double t=(double)1/(double)6; int g[maxn],n,m; double dp[maxn]; double go(int i,int d) { if (i+d>=n) return t; int pos=g[i+d]; while (pos!=-1) { if (g[pos]==-1) break; else { pos=g[pos]; } } if (pos==-1) pos=i+d; return t*(dp[pos]+1); } int main() { int i,j,x,y; while (scanf("%d%d",&n,&m)==2) { if (n==0&&m==0) break; for (i=0;i<=n;i++) { g[i]=-1; dp[i]=0; } for (i=0;i<m;i++) { scanf("%d%d",&x,&y); g[x]=y; } for (i=n-1;i>=0;i--) { for (j=1;j<=6;j++) { dp[i]+=go(i,j); } } printf("%.4lf\n",dp[0]); } }