【百度校招2016】蘑菇阵

博客探讨了如何使用动态规划解决一个概率问题:在蘑菇阵中,好友A从(1,1)出发,每步随机走(i,j+1)或(i+1,j),避开蘑菇到达(n,m)的概率。通过建立边界条件的动态规划模型来计算这个问题。" 116473182,10300550,柿饼UI移植到ART-Pi硬件平台,"['嵌入式开发', 'RTOS', 'Linux', '物联网', 'STM32']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在线编程练习链接:牛客网

题目描述:

现在有两个好友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

解答:

很容易想到利用动态规划求解。相似的题目为求解从起点走到终点的有多少条路线?核心转移方程为:dp[i][j]=dp[i-1][j

### 关于Java中的蘑菇实现 在Java中,蘑菇通常涉及动态规划算法的应用。以下是基于已有引用内容以及相关知识构建的一个完整的解决方案。 #### 动态规划的核心思路 蘑菇问题可以通过动态规划求解。假设有一个`N×M`的网格,其中某些位置放置了蘑菇(标记为1),其余为空白(默认值为0)。目标是从起点到终点找到路径数量的最大化方案[^3]。 #### 初始条件设定 为了简化边界处理逻辑,在实际操作时会创建一个尺寸稍大的二维数组 `grid[N+1][M+1]` 来存储地图数据,并将初始状态置零。对于输入的蘑菇坐标,则将其对应的位置赋值为1。 #### 动态转移方程 定义函数 \( P(i,j) \) 表示到达第\(i\)行、第\(j\)列的方法总数。由于每次移动仅限向右或向下走一步,所以有如下关系式成立: \[ P(i, j) = P(i - 1, j) + P(i, j - 1),\quad 当前单元格无障碍物时;否则为0。\] 此表达式的含义在于当前节点可由上方或者左侧相邻节点过来构成新的通路组合数之和[^4]。 下面是具体的代码实现部分: ```java public class MushroomArray { public static void main(String[] args){ int N=5; // 假设有五行 int M=6; // 和六列 // 初始化草地数组,默认全填满障碍物即不可达 int[][] grid=new int[N+1][M+1]; // 放置几个蘑菇作为例子 placeMushroom(grid,2,3); placeMushroom(grid,4,5); System.out.println("原始地形图:"); printGrid(grid,N,M); long result=countPaths(N,M,grid); System.out.printf("\n从(1,1)->(%d,%d),总共有%ld条合法路线\n",N,M,result); } private static void placeMushroom(int[][] grid,int row,int col){ if(row>0 && col>0){ grid[row][col]=1; } } private static void printGrid(int[][] grid,int rows,int cols){ for(int i=1;i<=rows;i++){ StringBuilder sb=new StringBuilder(); for(int j=1;j<=cols;j++)sb.append(grid[i][j]).append(' '); System.out.println(sb.toString().trim()); } } private static long countPaths(int n,int m,int [][] obstacles){ long dp[][]=new long[n+1][m+1]; // 设置起始点可达性 dp[1][1]=(obstacles[1][1]==0)?1L:0L; for(int r=1;r<=n;r++) for(int c=1;c<=m;c++){ if(r==1&&c==1)continue;//跳过原点重复计算情况 if(obstacles[r][c]!=1){ dp[r][c]+=((r>=2)?dp[r-1][c]:0)+ ((c>=2)?dp[r][c-1]:0); } } return dp[n][m]; } } ``` 上述程序展示了如何利用二维数组模拟蘑菇分布状况,并借助动态规划方法统计有效行走轨迹数目。注意这里假定所有测试案例均满足至少存在一条可行线路的前提条件^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值