hdu 3853 LOOPS
题意:
给出一个n * m的格子,一个人在一开始在(1,1),要走到(n,m)。
假设在(x,y),每次她可以花费2点的魔法能量,p1的概率走到(x,y),p2的概率走到(x,y+1),p3的概率走到(x+1,y),保证p1+p2+p3 = 1。
问从(1,1)走到(n,m)花费的期望是多少。
思路:
简答概率dp,逆推。
dp[i][j] = (dp[i][j+1] * p2 + dp[i+1][j] * p3) / (1 - p1)。
但是要注意,当p1 == 1的时候要跳过。
代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 const int N = 1005; 6 double dp[N][N]; 7 double a[N][N][3]; 8 int main() 9 { 10 int n,m; 11 while (scanf("%d%d",&n,&m) != EOF) 12 { 13 memset(dp,0,sizeof(dp)); 14 for (int i = 1;i <= n;i++) 15 { 16 for (int j = 1;j <= m;j++) 17 { 18 for (int k = 0;k < 3;k++) 19 { 20 scanf("%lf",&a[i][j][k]); 21 } 22 } 23 } 24 dp[n][m] = 0; 25 for (int i = n;i >= 1;i--) 26 { 27 for (int j = m;j >= 1;j--) 28 { 29 if (i == n && j == m) continue; 30 if (fabs(1.0-a[i][j][0]) < 1e-8) continue; 31 dp[i][j] = (a[i][j][1] * dp[i][j+1] + a[i][j][2] * dp[i+1][j] + 2.0) / (1.0-a[i][j][0]); 32 } 33 } 34 printf("%.3f\n",dp[1][1]); 35 } 36 return 0; 37 }
康复训练中~欢迎交流!