概率DP 水题
#include<iostream>
using namespace std;
struct node{
double a,b,c;
}p[1005][1005];
double dp[1005][1005];
int main(){
int r,c;
while(cin>>r>>c){
int i,j;
for( i=1;i<=r;i++){
for(j=1;j<=c;j++)
scanf("%lf%lf%lf",&p[i][j].a,&p[i][j].b,&p[i][j].c);
}
dp[r][c]=0;
//dp[i][j]表示从位置(i,j)到达终点的期望,
//则dp[i][j]=(2+dp[i][j])*sa[i][j][0]+(2+dp[i][j+1])*sa[i][j][1]+(2+dp[i+1][j])*sa[i][j][2],
//移向即可得转移方程。
for(i=r;i>=1;i--){
for(j=c;j>=1;j--){
if(i==r && j==c)
continue;
if( p[i][j].a==1 )
continue;
dp[i][j]=( dp[i][j+1]*p[i][j].b+dp[i+1][j]*p[i][j].c+2)/(1-p[i][j].a);
}
}
printf("%.3lf\n",dp[1][1]);
}
return 0;
}