题意:在
(i,j)
处的点有
rate(i,j,1)
的概率留在
(i,j)
处,有
rate(i,j,2)
的概率走向
(i,j+1)
处,有
rate(i,j,3)
的概率走向
(i+1,j)
处,走一步需要花费2,问从
(1,1)
走到
(n,m)
处花费的期望是多少?
思路:期望是概率的反推过程
Eij=rate(i,j,1)∗Eij+rate(i,j,2)∗Ei,j+1+rate(i,j,3)∗Ei+1,j+2
+2是走一步的代价是从之前那个状态走一步才能到Eij
移项后
Eij=(rate(i,j,2)∗Ei,j+1+rate(i,j,3)∗Ei+1,j+2)/(1−rate(i,j,1))
http://acm.hdu.edu.cn/showproblem.php?pid=3853
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = (a) ; i <= (b) ; i ++)
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --)
#define repS(it,p) for(auto it = p.begin() ; it != p.end() ; it ++)
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)
#define cls(a,x) memset(a,x,sizeof(a))
#define eps 1e-8
using namespace std;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;
typedef long long LL;
typedef unsigned long long ULL;
int T,n,m;
int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};
double rate[1005][1005][4];
double E[1005][1005];
int v[1005][1005];
void input() {
rep(i,1,n) rep(j,1,m) rep(k,1,3) scanf("%lf",&rate[i][j][k]);
}
void solve() {
cls(v,0);
rep(i,1,n) rep(j,1,m) if(fabs(rate[i][j][2]+rate[i][j][3]) > eps) v[i][j] = 1;
v[n][m] = 1;
rrep(i,1,n) rrep(j,1,m) {
E[i][j] = 0;
if(i == n && j == m) continue;
if(v[i][j+1]) {
E[i][j] += (rate[i][j][2] * E[i][j+1]) / (1-rate[i][j][1]);
}
if(v[i+1][j]) {
E[i][j] += (rate[i][j][3] * E[i+1][j]) / (1-rate[i][j][1]);
}
E[i][j] += 2 / (1-rate[i][j][1]);
}
printf("%.3f\n",E[1][1]);
}
int main(void) {
while(~scanf("%d %d",&n,&m)) {
input();
solve();
}
return 0;
}