解题思路:dp[i][j]表示以(i,j)为起点到终点(n,m)所需要的步数。dp[i][j]=(dp[i][j]*p0+dp[i][j+1]*p1+dp[i+1][j]*p2+2)
经过化简可得dp[i][j]=(dp[i][j+1]*p1+dp[i+1][j]*p2+2)/(1-p0)也就是程序中的dp表达式
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define eps 1e-6
#define inf 0x3fffffff
using namespace std;
double dp[1005][1005],p[1005][1005][3];
int main()
{
int n,m;
//freopen("t.txt","r",stdin);
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<3;k++)
scanf("%lf",&p[i][j][k]);//三种概率
dp[n][m]=0;
for(int i=n;i>=1;i--)
{
for(int j=m;j>=1;j--)
{
if(i==n&&j==m) continue;
if(fabs(1-p[i][j][0])<eps)
{
dp[i][j]=inf;
continue;
}
dp[i][j]=(dp[i+1][j]*p[i][j][2]+dp[i][j+1]*p[i][j][1]+2)/(1-p[i][j][0]);
}
}
printf("%.3lf\n",dp[1][1]);
}
return 0;
}