题意:给你r*c的宫格,及下一步从该宫格原地不动、向右走、向下走三个方向的概率,求从(1,1)走到(r,c)的期望。
dp[i][j].magic=dp[i][j].left*dp[i][j+1].magic+dp[i][j].m*d[i][j].magic+dp[i][j].button*dp[i+1][j]+2;
变换得:dp[j][i].magic=(dp[j][i].b*dp[j+1][i].magic+dp[j][i].l*dp[j][i+1].magic+2)/(1-dp[j][i].m);
注意:可能会遇到下一步只能原地不动的点!即dp[i][j].m==1;
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
struct portal
{
double m,l,b;
double magic;
}p[1005][1005];
int main()
{
int r,c,i,j;
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].m,&p[i][j].l,&p[i][j].b);
}
for(i=c;i>=1;i--)
for(j=r;j>=1;j--)
{
if(p[j][i].m==1) p[j][i].magic=0;//停留在原地概率为1,即走到该点便无法走出loops
else{
p[j][i].magic=(p[j][i].b*p[j+1][i].magic+p[j][i].l*p[j][i+1].magic+2)/(1-p[j][i].m);
}
}
printf("%0.3lf\n",p[1][1].magic);
}
return 0;
}