您的位置:首页 > 运维架构

hdu 3853 LOOPS

2013-10-08 10:31 302 查看
题目大意:给一个R * C的格子,每个格子(i,j)到达(i,j)、(i,j+1)、(i+1,j)的概率分别为p1,p2,p3(p1+p2 +p3 = 1),每走一个格子需要花费的魔力为2,求从(1,1)走到(R,C)所需要魔力的期望。

解题思路:果然是个大水题啊~~  很容易退出状态转移方程,不过有个小trick,就是当格子(i,j)的p1=1,即格子只能留在当前的格子处时,dp[i][j] = 0; 其他 dp[i][j] = ( p[i][j][2] * dp[i][j+1] + p[i][j][3] * dp[i+1][j]  + 2) / (1- p[i][j][1])。

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#define N 1024

double dp

;
double p

[4];

int  main()
{
int r, c;
while(~scanf("%d %d", &r, &c))
{
for(int i = 1; i <= r; i ++)
{
for(int j = 1; j <= c; j ++)
{
scanf("%lf %lf %lf", &p[i][j][1], &p[i][j][2], &p[i][j][3]);
}
}
memset(dp, 0, sizeof(dp));
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(p[i][j][1] == 1)
{
dp[i][j] = 0;
continue;
}
dp[i][j] = (p[i][j][2]* dp[i][j+1] + p[i][j][3] * dp[i+1][j] + 2)/ (1 - p[i][j][1]);
}
}
printf("%.3lf\n", dp[1][1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  期望 dp