http://acm.hdu.edu.cn/showproblem.php?pid=3853
题意:有R*C个格子,一个家伙要从(0,0)走到(R-1,C-1) 每次只有三次方向,分别是不动,向下,向右,告诉你这三个方向的概率,以及每走一步需要耗费两个能量,问你走到终点所需要耗费能量的数学期望:
回头再推次,思想跟以前的做过的类似
注意点:分母为0的处理
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <iomanip>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;
#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)
const ll ll_INF = ((ull)(-1))>>1;
const double EPS=1e-8;
const int MAXN = 1000+100;
double dp[MAXN][MAXN],mat[MAXN][MAXN][3];
int r,c;
int main()
{
while(~scanf("%d%d",&r,&c))
{
CL(dp,0);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
for(int k=0;k<3;k++)
scanf("%lf",&mat[i][j][k]);
for(int i=r;i>0;i--)
for(int j=c;j>0;j--)
{
if(i==r && j==c)dp[i][j]=0;
if(abs(mat[i][j][0]-1.0)<EPS)continue;
dp[i][j]=(dp[i+1][j]*mat[i][j][2]+dp[i][j+1]*mat[i][j][1]+2)/(1.0-mat[i][j][0]);
}
printf("%.3lf\n",dp[1][1]);
}
return 0;
}