hdu3853_概率dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853

题目大意:起点(1, 1)终点(r, c), 每 个网格点(i, j)有一个传送装置,可以到(i, j)、(i, j+1)、(i, j+1), 不管走或不走,都消耗2个能量,问到终点消耗能量的期望是多少。

答案不大于 1000000

当停留在某点的概率等于1时,是不能走出去的,这时答案趋于无穷大,所以不能到这种网格点

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cstdlib>
 6 #include <cmath>
 7 #include <set>
 8 #include <map>
 9 #include <queue>
10 #include <vector>
11 #define INF 0x3f3f3f3f
12 using namespace std;
13 
14 const int N = 1010;
15 double p1[N][N], p2[N][N], p3[N][N], dp[N][N];
16 int main()
17 {
18     int r, c;
19     while(~scanf("%d %d", &r, &c))
20     {
21         memset(dp, 0, sizeof(dp));
22         memset(p1, 0, sizeof(p1));
23         memset(p2, 0, sizeof(p2));
24         memset(p3, 0, sizeof(p3));
25         for(int i = 1; i <= r; i++)
26             for(int j = 1; j <= c; j++)
27                 scanf("%lf %lf %lf", &p1[i][j], &p2[i][j], &p3[i][j]);
28         for(int i = r; i > 0; i--)
29         {
30             for(int j = c; j > 0; j--)
31             {
32                 if(i == r && j == c)
33                     continue;
34                 if(1 - p1[i][j] == 0)
35                     continue;
36                 dp[i][j] = (dp[i][j + 1] * p2[i][j] + dp[i + 1][j] * p3[i][j] + 2) / (1 - p1[i][j]);
37             }
38         }
39         printf("%.3lf\n", dp[1][1]);
40     }    
41     return 0;
42 }
View Code

 

posted @ 2016-07-22 17:36  海无泪  阅读(119)  评论(0编辑  收藏  举报