天天看點

HDU 3853 LOOPS——期望dp

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
double eps = 1e-4;
int r, c;
double p1[maxn][maxn], p2[maxn][maxn], p3[maxn][maxn];
double dp[maxn][maxn];
int main() {
    while (~scanf("%d%d", &r, &c)) {
        for (int i = 1; i <= r; i++) {
            for (int j = 1; j <= c; j++) scanf("%lf%lf%lf", &p1[i][j],&p2[i][j],&p3[i][j]);
        }
        memset(dp, 0, sizeof(dp));
        for (int i = r; i >= 1; i--) {
            for (int j = c; j >= 1; j--) {
                if (1-p1[i][j] < eps) dp[i][j] = 0;
                else dp[i][j] = (p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+1][j]+2)/(1-p1[i][j]);
            }
        }
        printf("%.3f\n", dp[1][1]);
    }
    return 0;
}