/*
概率dp
逆推:设dp[i][j]为离出口处还需要多少期望.则dp[R][C]为0.
公式:dp[i][j]=(2+dp[i][j])*map[i][j][0]+(2+dp[i][j+1])*map[i][j][1]+(2+dp[i+1][j])*map[i][j][2]
将左边的dp[i][j]移到右边:
dp[i][j]=((2*map[i][j][0]+(2+dp[i][j+1])*map[i][j][1]+(2+dp[i+1][j])*map[i][j][2])/(1-map[i][j][0])//注意判断1-map[i][j][0]..
//状态转移方程有待进一步理解.
正推:做起来很麻烦.....
为什么?比如 dp[i][j]是起点到i,j所需的期望..如果i,j点可以自己到自己。后面继续推就很麻烦了。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define R 1001
#define C 1001
using namespace std;
double dp[R][C];
double map[R][C][3];
int r,c;
int main()
{
freopen("test.txt","r",stdin);
while(scanf("%d%d",&r,&c)!=EOF)
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
dp[i][j]=0;
scanf("%lf%lf%lf",&map[i][j][0],&map[i][j][1],&map[i][j][2]);
}
}
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(map[i][j][0]==1)
{
continue;
}
dp[i][j]=(map[i][j][0]+(1+dp[i][j+1])*map[i][j][1]+(1+dp[i+1][j])*map[i][j][2]);
dp[i][j]/=1-map[i][j][0];
}
}
printf("%.3lf\n",2*dp[1][1]);
}
}
hdu3853 LOOPS
最新推荐文章于 2021-02-27 13:53:24 发布