传送门
题解:
设dp[i][j]表示从(i,j)走到(n,m)的期望花费,倒推即可。
P.S.小心停留概率为1的情况,必须跳过,否则会除0。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=1004;
double dp[MAXN][MAXN],a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN];
int n,m;
int main() {
while (~scanf("%d%d",&n,&m)) {
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;++i)
for (int j=1;j<=m;++j)
scanf("%lf%lf%lf",&a[i][j],&b[i][j],&c[i][j]);
for (int i=n;i;--i)
for (int j=m;j;--j)
if ((i^n||j^m)&&a[i][j]!=1.0)
dp[i][j]=(b[i][j]*dp[i][j+1]+c[i][j]*dp[i+1][j]+2)/(1-a[i][j]);
printf("%.3lf\n",dp[1][1]);
}
return 0;
}