【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录
题目描述
园区某部门举办了Family Day,邀请员工及其家属参加;
将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;
家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。
输入描述
第一行为园区的长和宽;
后面每一行表示该园区是否可以参观,0表示可以参观,1表示不能参观
输出描述
输出为不同的路径数量
用例1
输入
3 3
0 0 0
0 1 0
0 0 0
输出
2
用例2
输入
3 3
0 1 0
0 1 0
0 0 0
输出
1
考点
动态规划
解题思路
在本题中,我们要求的是从园区左上角到右下角有多少种不同的参观路径。
这个问题符合动态规划的应用场景:
重叠子问题:在计算到达某个园区的不同路径数量时,会涉及到到达其上方和左侧园区的路径数量。例如,在计算 (i, j) 园区的路径数时,需要知道 (i-1, j) 和 (i, j-1) 的路径数,这意味着当我们计算其他位置时,可能会再次用到这些信息。
最优子结构:问题的最优解可以通过组合其子问题的最优解来构造。具体来说,(i, j) 位置的路径数量等于其上方 (i-1, j) 和左侧 (i, j-1) 两个位置路径数量之和,前提是当前位置是可以参观的。
因此,我们可以采用一个二维数组 dp 来保存每个园区的路径数量,初始化时,左上角园区(起点)的路径数量为1,然后按照从上到下、从左到右的顺序遍历整个园区,根据每个园区是否可参观以及与相邻园区的关系来递推计算每个园区的路径数量。最终,右下角园区(终点)的路径数量即为所求答案。
代码
c++
#include <bits/stdc++.h>
using namespace std;
int main() {
int n,m;
cin>>m>>n;
vector<vector<int>> mat(m, vector<int>(n));
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>mat[i][j];