hdu 3853 LOOPS

去北邮比赛因为没考虑这个WA到比赛结束,郁闷啊,不然就绝对不止4题了

由于可能出现a[i][j]=1的情况,除了以后就可能出现某个值是无穷大,那么等下用0去乘后就不为0了!!!

其实题目说了,不存在大于10^6的答案,所以没有概率大于0的路径通过a[i][j]=1这种格子,可是上面的会导致错误


#include <cstdio>
#include <cstring>
#include <cmath>
const int MAXN= 1000 + 123;
double a[MAXN][MAXN], b[MAXN][MAXN], c[MAXN][MAXN];
double e[MAXN][MAXN];
int main()
{
    int rr,rc;
    while(scanf("%d%d", &rr, &rc) != EOF)
    {
        for(int i = 1; i <= rr; i++)
           for(int  j = 1; j <= rc; j++)
           scanf("%lf%lf%lf", &a[i][j], &b[i][j], &c[i][j]);//原地,右方,下面
        //e[i][j] = 2 + a[i][j] * e[i][j] + b[i][j] * e[i][j+1] + c[i][j] * e[i+1][j]
        for(int i = rr; i >= 1; i--)
           for(int j = rc; j >= 1; j--)
           {
               e[i][j] = 0;
               if( i== rr && j == rc) continue;
               if(i < rr)  e[i][j] += c[i][j] * e[i+1][j];
               if(j < rc)  e[i][j] += b[i][j] * e[i][j+1];
               e[i][j] += 2.00;
               if(fabs(a[i][j] - 1.00) > 1e-8)  e[i][j] = e[i][j] / (1 - a[i][j]);
               else e[i][j] = 1.00 ;
           }
           printf("%0.3lf\n", e[1][1]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值