蘑菇阵(动态规划、百度)——unique paths

题目描述

现在有两个好友A和B,住在一片长有蘑菇的由n*m个方格组成的草地,A在(1,1),B在(n,m)。现在A想要拜访B,由于她只想去B的家,所以每次她只会走(i,j+1)或(i+1,j)这样的路线,在草地上有k个蘑菇种在格子里(多个蘑菇可能在同一方格),问:A如果每一步随机选择的话(若她在边界上,则只有一种选择),那么她不碰到蘑菇走到B的家的概率是多少?

输入描述:
第一行N,M,K(2 ≤ N,M ≤ 20, k ≤ 100),N,M为草地大小,接下来K行,每行两个整数x,y,代表(x,y)处有一个蘑菇。

输出描述:
输出一行,代表所求概率(保留到2位小数)

输入例子:
2 2 1
2 1

输出例子:
0.50
解题思路:
题目要求的是不碰到蘑菇的概率,一开始我使用路径数的方法来求解的(p=不碰到蘑菇的走法/所有的走法),但是一直都未能通过所有测试。后来认真研究了下题目,也看了些网上的一些资料。题目要求要计算不碰到蘑菇的概率,因为走的概率不均等,如
2 3的蘑菇阵
1 2 3
4 5 6
从1 走到6
1-2的概率为0.5,2-3概率为0.5,3-6概率为1
1-4的概率为0.5,2-5概率为0.5,4-5概率为1,5-6概率为1,3-6概率为1
若走1-2-3-6概率为0.25,1-2-5-6概率为0.25,而走1-4-5-6的概率为0.5
所以三种走法的概率不均等,所以算其不碰到蘑菇的概率不可以用枚举路径数的方法计算。只能往两个方向走,所以两个方向的概率都是0.5,但是在边界处只有一种走法也就是该走法的概率为1,需要单独对边界进行处理。
不是边界的计算不碰到蘑菇的概率:
ways[i][j] = ways[i-1][j] * 0.5 * (map[i-1][j] + 1)%2+ ways[i][j-1] * 0.5 (map[i-1][j] + 1)%2 即为上面和左边的方向过来,前提上面和左边都没有蘑菇
边界的处理:
最底端第n行:ways[i][j] = ways[i][j-1] * (map[i-1][j] + 1)%2
最右边第m列:ways[i][j] = ways[i-1][j] * (map[i-1][j] + 1)%2

public static double getProbability(int map[][], int n, int m) {
        double ways[][] = new double[n][m];// 没走蘑菇阵的概率
        ways[0][0] = 1;

        // int ti = 0, tj = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
  //注意处理单行和单列的问题
                if (j == m - 1 && i - 1 >= 0) {
  // 最右边
                        ways[i][j] += ways[i - 1][j];   
                }
                if (i == n - 1 && j -1 >=0) {
  // 最下边
                    ways[i][j] += ways[i][j - 1];
                }
                if(i - 1 >= 0)//不止一行
                    if (map[i - 1][j] != 1 && j != m - 1) {
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值