算是入门的第二题了。
魔法师在迷宫中分别有p_loop的概率停留,p_right的概率走到(i,j+1),p_down的概率走到(i+1,j),每走一次消耗2点魔法值。
dp[i][j]表示从当前走到(R,C)所需要的魔法值,则有:dp[i][j]=dp[i][j]*p_loop[i][j]+dp[i][j+1]*p_right[i][j]+dp[i][j+1]*p_down[i][j]+2;
移项化简后有:dp[i][j]=dp[i][j+1]*p_right[i][j]/(1-p_loop[i][j])+dp[i+1][j]*p_down[i][j]/(1-p_loop[i][j])+2/(1-p_loop[i][j]);
因为分母不能为零,所以要保证(1-p_loop[i][j])不为零。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define mm(a,b) memset(a,b,sizeof(a))
#define maxn 1010
using namespace std;
const int inf=0x7ffffff;
const double PI=acos(-1.0);
const double eps=1e-8;
const double e=2.7182818284590452354;
double dp[maxn][maxn];
double p_loop[maxn][maxn];
double p_right[maxn][maxn];
double p_down[maxn][maxn];
int main()
{
int r,c;
while(~scanf("%d%d",&r,&c))
{
mm(dp,0);
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
scanf("%lf%lf%lf",&p_loop[i][j],&p_right[i][j],&p_down[i][j]);
dp[r][c]=0;
for(int i=r;i>=1;i--)
for(int j=c;j>=1;j--)
{
if(i==r && j==c) continue;
if((1-p_loop[i][j])<eps) continue;
dp[i][j]=dp[i][j+1]*p_right[i][j]/(1-p_loop[i][j])+dp[i+1][j]*p_down[i][j]/(1-p_loop[i][j])+2/(1-p_loop[i][j]);
}
printf("%.3lf\n",dp[1][1]);
}
return 0;
}