hdu-3853(dp+期望)

题意:给你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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值