hdu 3853 LOOPS
2013-10-08 10:31
302 查看
题目大意:给一个R * C的格子,每个格子(i,j)到达(i,j)、(i,j+1)、(i+1,j)的概率分别为p1,p2,p3(p1+p2 +p3 = 1),每走一个格子需要花费的魔力为2,求从(1,1)走到(R,C)所需要魔力的期望。
解题思路:果然是个大水题啊~~ 很容易退出状态转移方程,不过有个小trick,就是当格子(i,j)的p1=1,即格子只能留在当前的格子处时,dp[i][j] = 0; 其他 dp[i][j] = ( p[i][j][2] * dp[i][j+1] + p[i][j][3] * dp[i+1][j] + 2) / (1- p[i][j][1])。
代码如下:
解题思路:果然是个大水题啊~~ 很容易退出状态转移方程,不过有个小trick,就是当格子(i,j)的p1=1,即格子只能留在当前的格子处时,dp[i][j] = 0; 其他 dp[i][j] = ( p[i][j][2] * dp[i][j+1] + p[i][j][3] * dp[i+1][j] + 2) / (1- p[i][j][1])。
代码如下:
#include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #define N 1024 double dp ; double p [4]; int main() { int r, c; while(~scanf("%d %d", &r, &c)) { for(int i = 1; i <= r; i ++) { for(int j = 1; j <= c; j ++) { scanf("%lf %lf %lf", &p[i][j][1], &p[i][j][2], &p[i][j][3]); } } memset(dp, 0, sizeof(dp)); dp[r][c] = 0; for(int i = r; i >= 1; i --) { for(int j = c; j >= 1; j --) { if(i == r && j == c) continue; if(p[i][j][1] == 1) { dp[i][j] = 0; continue; } dp[i][j] = (p[i][j][2]* dp[i][j+1] + p[i][j][3] * dp[i+1][j] + 2)/ (1 - p[i][j][1]); } } printf("%.3lf\n", dp[1][1]); } return 0; }
相关文章推荐
- HDU 3853 LOOPS (期望DP)
- HDU 3853 LOOPS(概率dp)
- HDU 3853 LOOPS 概率dp入门 (1)
- HDU 3853 LOOPS (概率DP水题)
- HDU 3853 LOOPS (概率dp)
- 简单概率dp(期望)-hdu-3853-LOOPS
- hdu 3853 LOOPS
- HDU 3853 LOOPS(概率dp)
- hdu 3853 LOOPS 【概率DP】
- HDU 3853 LOOPS (概率DP)
- HDU-3853 LOOPS (概率dp)
- HDU 3853 — LOOPS
- HDU 3853 LOOPS
- LOOPS(HDU 3853)
- HDU 3853 LOOPS (简单期望)
- hdu 3853 LOOPS 动态规划
- hdu 3853 LOOPS 概率dp
- HDU 3853 LOOPS 期望dp
- hdu 3853LOOPS (概率DP)
- HDU 3853 LOOPS