加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

HDU 3853 LOOPS 北邮邀请赛

(2011-07-18 19:25:07)
标签:

hdu

3853

loops

北邮邀请赛

it

分类: 动态规划
题目描述:
给你R*C的地图,对于每个点,有a的概率不动,b的概率往右走一格,c的概率往下走一格。
为你从0,0走到r-1,c-1需要的期望步数。
解题报告:
dp[i][j]表示从i,j走到r-1,c-1的期望。由于ij能走到ij,i j+1和i+1 j
所以dp[i][j] = a * (2 + dp[i][j]) + b * (2 + dp[i][j + 1] + c * (2 + dp[i + 1][j])
把右边的dp[i][j]移到左边,就可以得到dp[i][j]的转移。比较容易理解。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n, m;
double x[1002][1002][3];
double dp[1002][1002];
double jeo(int a, int b)
{
    if (a == n - 1 && b == m - 1) return 0.0;
    if(x[a][b][0] == 1.0)
        return 0;
    if (dp[a][b] < 0)
    {
        dp[a][b] = (2 * (x[a][b][0] + x[a][b][1] + x[a][b][2]));
        if (b + 1 < m) dp[a][b] += x[a][b][1] * jeo(a, b + 1);
        if (a + 1 < n) dp[a][b] += x[a][b][2] * jeo(a + 1, b);
        dp[a][b] /= (1 - x[a][b][0]);
    }
    return dp[a][b];
}
int main()
{
    while(scanf("%d%d", &n, &m) != EOF)
    {
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++)
                for(int k = 0; k < 3; k++)
                    scanf("%lf", &x[i][j][k]);
        for(int i = 0; i < n; i++)
            for(int j = 0; j < m; j++) dp[i][j] = -1;

        printf("%.3f\n", jeo(0, 0));
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有