右式中也有dp[i][j],所以把方程转化一下:dp[i][j] = dp[i][j]*mp[i][j][0] + dp[i][j+1]*mp[i][j][1] + dp[i+1][j]*mp[i][j][2];
注意到一个地方:dp[i][j] = (dp[i][j+1]*mp[i][j][1] + dp[i+1][j]*mp[i][j][2] + 2) / (1 - mp[i][j][0]);
(1 - mp[i][j][0]);要注意mp[i][j][0]为1的情况。假设为1,意味走到这里的话,一定就停下了。所以期望是0。
#include<iostream>
#include<cmath>
using namespace std;
#define MAXN 1010
#define eps 1e-8
double dp[MAXN][MAXN];
double mp[MAXN][MAXN][3];
int main()
{
int n, m;
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", &mp[i][j][k]);
}
}
}
memset(dp, 0, sizeof(dp));
for(int i = n; i > 0; i--)
{
for(int j = m; j > 0; j--)
{
if(i == n && j == m)continue;
if(fabs(1 - mp[i][j][0]) < eps)continue;
dp[i][j] = (dp[i][j+1]*mp[i][j][1] + dp[i+1][j]*mp[i][j][2] + 2) / (1 - mp[i][j][0]);
};
}
printf("%.3lf\n", dp[1][1]);
}
}