HDU 3853 LOOPS

题意:对于每一格,都可以往右走,原地不走,往下走,概率分别为a[i],b[i],c[i](每一个格子与其他格子的概率不一定相同)。在R*C的棋盘上(输入数据保证不会走出棋盘),求从(0, 0)走到(R-1, C-1)所需要的步数*2的期望是多少。

 

解法:就是最普通的dp,从(R-1, C-1)往(0, 0)算就好。设dp[i][j]表示达到目标状态的步数期望*2。dp[i][j] = dp[i][j]*a[k] + dp[i][j+1]*b[k] + dp[i+1][j]*c[k]。注意,如果a[k]= 1,应该直接dp[i][j] = 0; continue。

 

tag: 概率DP, 水题

 

 1 /*
 2  * Author:  Plumrain
 3  * Created Time:  2013-11-07 23:13
 4  * File Name: DP-HDU-3853.cpp
 5  */
 6 #include <iostream>
 7 #include <cstdio>
 8 #include <cstring>
 9 #include <cmath>
10 
11 using namespace std;
12 
13 #define CLR(x) memset(x, 0, sizeof(x))
14 const double eps = 1e-8;
15 struct grd{
16     double p[3], x[3];
17 };
18 
19 int r, c;
20 grd a[1005][1005];
21 double d[1005][1005];
22 
23 void init()
24 {
25     for (int i = 0; i < r; ++ i)
26         for (int j = 0; j < c; ++ j)
27             for (int k = 0; k < 3; ++ k)
28                 scanf ("%lf", &a[i][j].p[k]);
29 }
30 
31 double DP()
32 {
33     CLR (d);
34     for (int i = r-1; i >= 0; -- i)
35         for (int j = c-1; j >= 0; -- j)
36             if (!(i == r-1 && j == c-1)){
37                 if (fabs(a[i][j].p[0] - 1) < eps) continue;
38                 d[i][j] = (d[i][j+1]*a[i][j].p[1] + d[i+1][j]*a[i][j].p[2] + 2) / (1 - a[i][j].p[0]);
39             }
40     return d[0][0];
41 }
42 
43 int main()
44 {
45     while (scanf ("%d%d", &r, &c) != EOF){
46         init();
47         printf ("%.3lf\n", DP());
48     }
49     return 0;
50 }
View Code

 

posted @ 2013-11-09 20:39  Plumrain  阅读(161)  评论(0编辑  收藏  举报