水题,注意有一种永远留在当前的情况要判断下,如果是直接跳,因为这个位置是不可能到达的(不然怎么算概率)
//注意trick
#include<cstdio>
using namespace std;
#define eps 1e-5
#define N 1010
double dp[N][N];
double st[N][N];
double right[N][N];
double down[N][N];
int main(){
int i,j;
int r,c;
while(scanf("%d %d",&r,&c)!=EOF){
for(i=1;i<=r;i++){
for(j=1;j<=c;j++){
scanf("%lf %lf %lf",&st[i][j],&right[i][j],&down[i][j]);
}
}
dp[r][c]=0;
for(i=r;i>0;i--){
for(j=c;j>0;j--){
if(!(i==r&&j==c)){
if(1-st[i][j]<eps) continue;
dp[i][j]=(right[i][j]*dp[i][j+1]+down[i][j]*dp[i+1][j]+1)/(1-st[i][j]);
}
}
}
printf("%.3f\n",2*dp[1][1]);
}
return 0;
}