题目链接: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 ", dp[1][1]); 40 } 41 return 0; 42 }