HDOJ 3853 LOOPS (概率DP)
来源:互联网 发布:js开头的白色车牌 编辑:程序博客网 时间:2024/06/01 10:28
点击打开链接
题意:有一个R*C的图,从(1,1)走到(R,C)。每一格都给出了留在原地,向右走一格,向下走一格的概率。无论哪一种都会消耗能量2。求从起点到终点的消耗的期望能量。
为了让状态转移方程比较简单,此题概率DP倒着做的。本题中,dp[i][j]表示从(i,j)到终点所消耗的期望能量。容易得出,dp[i][j] = dp[i][j] * p[i][j][0] + dp[i][j+1] * p[i][j][1] + dp[i+1][j] * p[i][j][2] + 2。从(i,j)开始往后走一步会怎么样?化简可得状态转移方程。
本题要注意的是特殊情况, 如果p[i][j][0]等于1,那么dp[i][j]就要等于0,这样就意味着走到(i,j)就停住了,所以此后消耗的能量一定为0。所以干脆给dp数组初始化为0,遇到这种情况直接用continue跳过。
还有一个要注意的特殊情况就是超出边界,由于超出边界的走法概率一定为0,就相当于排除了这种走法。
#include<cstdio>#include<cmath>#include<cstring>const int N = 1005;const double eps = 1e-7;double dp[N][N], p[N][N][5];int main(){ int r, c; while (~scanf("%d%d", &r, &c)) { memset(dp, 0, sizeof(dp)); for (int i = 1; i <= r; i++) for (int j = 1; j <= c; j++) scanf("%lf%lf%lf", &p[i][j][0], &p[i][j][1], &p[i][j][2]); for (int i = r; i >= 1; i--) for (int j = c; j >= 1; j--) { if (fabs(p[i][j][0] - 1) < eps) continue; dp[i][j] = (dp[i][j+1] * p[i][j][1] + dp[i+1][j] * p[i][j][2] + 2) / (1 - p[i][j][0]); } printf("%.3f\n", dp[1][1]); } return 0;}
0 0
- HDOJ 题目3853 LOOPS(概率DP)
- HDOJ 3853 LOOPS (概率DP)
- HDOJ-3583LOOPS(概率DP)
- HDU 3853 LOOPS (概率dp)
- Hdu 3853 LOOPS(概率dp)
- HDU 3853 LOOPS(概率dp)
- HDU 3853 LOOPS(概率DP)
- HDU-3853 LOOPS (概率DP)
- HDU 3853 LOOPS (概率DP)
- HDU 3853 LOOPS (概率DP)
- hdu 3853 LOOPS(概率dp)
- HDOJ 3853 LOOPS(DP期望入门)
- hdu 3853 LOOPS 概率dp
- HDU 3853 LOOPS (概率DP)
- HDU 3853 LOOPS (概率dp)
- HDU 3853 LOOPS(概率dp)
- hdu-3853-LOOPS-概率dp
- HDU 3853 LOOPS(概率dp)
- 蓝桥杯 算法训练 排序
- 年后玩玩php,顺便发发牢骚
- 极限编程的思想方法在差错控制中的应用
- jsp是怎么运行的
- Java EE 之 过滤器入门学习与总结(1)
- HDOJ 3853 LOOPS (概率DP)
- 【bzoj2834】回家的路 最短路
- JAVA中的File类
- Java Cookie使用Unicode编码中文
- Java的多线程之同步篇三:同步阻塞、监视器、volatile、final、原子性、线程局部变量、锁测试与超时、读写锁
- Chapter 1-03
- Chapter 2-01
- Android中的WebView常用用法
- MIC性能优化