题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853
题目大意:有一个R*C的迷宫,开始点在[1,1],现在要走到[r,c],对于在点[x,y]可以消耗2点魔力打开一扇门,走到[x,],[x+1,y],[x,y+1],的概率分别为p0,p1,p2,问走到[r,c]点时消耗魔力的期望值。
分析:我们用dp[i][j]表示在点[i,j]到达[r,c]所需要消耗魔力的期望,那么很显然,dp[r,c]=2,对于前面的前,我们有dp[i,j]=p0*dp[i,j]+p1*dp[x+1,y]+p2*dp[x,y+1]+2.
实现代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std;
const int MAX=1000+10;
int n,m;
double dp[MAX][MAX],p[MAX][MAX][3];
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)scanf("%lf%lf%lf",&p[i][j][0],&p[i][j][1],&p[i][j][2]);
}
memset(dp,0,sizeof dp);
for(int i=n;i>=1;--i){
for(int j=m;j>=1;--j){
if(i == n && j == m)continue;
if(p[i][j][0] == 1.00)continue;//该点无路可走,期望值肯定为0(dp[i][j]=0)
dp[i][j]=(p[i][j][1]*(dp[i][j+1])+p[i][j][2]*(dp[i+1][j])+2)/(1-p[i][j][0]);
}
}
printf("%.3lf\n",dp[1][1]);
}
return 0;
}