题意:给出一个r*c的迷宫,每个格子可以走到(r,c),(r+1,c),(r,c+1),概率分别为p1 p2 p3 ,没走一次消耗2各单位的能量,问从(1,1)走到(r,c) 的平均能量
解析:
设dp[i][j]表示(i,j)到(R,C)需要消耗的能量
则:
dp[i][j]=p1[i][j]*dp[i][j]+p2[i][j]*dp[i][j+1]+p3[i][j]*dp[i+1][j]+2;
化简得到:
dp[i][j]=(dp[i][j+1]*p[i][j].p2+dp[i+1][j]*p[i][j].p3+2.0)/(1.0-p[i][j].p1); (必须将右边的dp【i】【j】移到左边)
注意一种情况就是p1[i][j]==1的情况。不能做分母,dp=0
#include<iostream>
#include<cstdio>
#include<string.h>
#include<math.h>
using namespace std;
#define N 1005
struct node
{
double p1,p2,p3;
};
node p[N][N];
double dp[N][N];
int main()
{
int i,j,r,c;
while(~scanf("%d%d",&r,&c))
{
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
scanf("%lf%lf%lf",&p[i][j].p1,&p[i][j].p2,&p[i][j].p3);
}
memset(dp,0,sizeof(dp));
for(i=r;i>0;i--)
{
for(j=c;j>0;j--)
{
if(i==r&&j==c) continue;
if(1.0-p[i][j].p1<1e-5) continue;
dp[i][j]=(dp[i][j+1]*p[i][j].p2+dp[i+1][j]*p[i][j].p3+2.0)/(1.0-p[i][j].p1);
}
}
printf("%.3lf\n",dp[1][1]);
}
return 0;
}