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 }
------------------------------------------------------------------
现在的你,在干什么呢?
你是不是还记得,你说你想成为岩哥那样的人。
现在的你,在干什么呢?
你是不是还记得,你说你想成为岩哥那样的人。