hdu3853 从一个点走到终点期望消耗能量(概率dp入门题)+概率dp初步总结
首先学习概率dp,讲的很好的网站:
http://kicd.blog.163.com/blog/static/126961911200910168335852/
然后也有引自http://blog.csdn.net/auto_ac/article/details/9907881博文的一段话:
很多概率题总逃不开用dp转移。
期望题总是倒着推过来的,概率是正着推的,多做题就会理解其中的原因
有些期望题要用到有关 概率 或 期望的常见公式或思想
遇到dp转移方程(组)中有环的,多半逃不出高斯消元(手动 和 写代码 两种)
这套题中还有道树上的dp转移,还用dfs对方程迭代解方程, 真是大开眼界了
当然还有与各种算法结合的题,关键还是要学会分析
当公式或计算时有除法时, 特别要注意分母是否为零
期望的话,比如本题,首先如果要求pos点期望能量,我们看一下他的后继点需要能量,乘以概率加上,再加到达后继点的2点能量,就是pos点的期望,化简一下就能得到递推式==
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<cmath> 5 #define eps 1e-8 6 using namespace std; 7 double dp[1005][1005],p[1005][1005][4]; 8 int main() 9 { 10 int n,m,i,j,k; 11 while (~scanf("%d%d",&n,&m)) 12 { 13 memset(p,0,sizeof(p)); 14 for (i=1;i<=n;i++) 15 for (j=1;j<=m;j++) 16 for (k=1;k<=3;k++) scanf("%lf",&p[i][j][k]); 17 memset(dp,0,sizeof(dp)); 18 for (i=n;i>=1;i--) 19 for (j=m;j>=1;j--) 20 if (i==n&&j==m) continue; 21 else if (fabs(p[i][j][1]-1)<=eps) continue; 22 else dp[i][j]=dp[i][j+1]*p[i][j][2]/(1-p[i][j][1])+ 23 dp[i+1][j]*p[i][j][3]/(1-p[i][j][1])+2.0/(1-p[i][j][1]); 24 printf("%.3lf\n",dp[1][1]); 25 } 26 }