Family Day/园区参观路径(C语言)

news/2024/7/20 18:47:53 标签: c语言, 数据结构, 华为od, 算法

题目描述

园区某部门举办了Family Day,邀请员工及其家属参加;
将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角;
家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。
image-20231204211222633

输入描述

第一行为园区的长和宽;
后面每一行表示该园区是否可以参观,0表示可以参观,1表示不能参观

输出描述

输出为不同的路径数量

用例

输入

3 3
0 0 0
0 1 0
0 0 0

输出

2

思路

动态规划(Dynamic Programming, DP)是一种在数学、管理科学、计算机科学、经济学等多领域中用于求解最优化问题的算法思想。它主要针对具有重叠子问题和最优子结构的问题,通过将复杂问题分解为相对简单的子问题,并存储并重用这些子问题的解以减少重复计算,从而得到原问题的最优解或所有可能解的数量。

在本题中,我们要求的是从园区左上角到右下角有多少种不同的参观路径。这个问题符合动态规划的应用场景:

  1. 重叠子问题:在计算到达某个园区的不同路径数量时,会涉及到到达其上方和左侧园区的路径数量。例如,在计算 (i, j) 园区的路径数时,需要知道 (i-1, j)(i, j-1) 的路径数,这意味着当我们计算其他位置时,可能会再次用到这些信息。

  2. 最优子结构:问题的最优解可以通过组合其子问题的最优解来构造。具体来说,(i, j) 位置的路径数量等于其上方 (i-1, j) 和左侧 (i, j-1) 两个位置路径数量之和,前提是当前位置是可以参观的。

因此,我们可以采用一个二维数组 dp 来保存每个园区的路径数量,初始化时,左上角园区(起点)的路径数量为1,然后按照从上到下、从左到右的顺序遍历整个园区,根据每个园区是否可参观以及与相邻园区的关系来递推计算每个园区的路径数量。最终,右下角园区(终点)的路径数量即为所求答案。

代码

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 读取园区的行数(高)和列数(宽)
    int m, n;
    scanf("%d %d", &m, &n);

    // 初始化一个m×n的二维数组map,用于存储每个园区是否可以参观
    int map[m][n];
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            // 读取输入数据,0表示园区可参观,1表示不可参观
            scanf("%d", &map[i][j]);
        }
    }

    // 初始化一个与map同样大小的二维数组dp,用于动态规划计算不同路径数量
    int dp[m][n];

    // 动态规划遍历整个园区
    for (int i = 0; i < m; i++) {     // 遍历行
        for (int j = 0; j < n; j++) { // 遍历列

            // 当前园区可参观时
            if (map[i][j] == 0) {
                // 如果在起点(0, 0),则只有一种路径(自身)
                if (i == 0 && j == 0) {
                    dp[i][j] = 1;
                }
                // 如果在第一列(即只有向右的移动),则当前园区的路径数等于上一行同列园区的路径数
                else if (i == 0) {
                    dp[i][j] = dp[i][j - 1];
                }
                // 如果在第一行(即只有向下的移动),则当前园区的路径数等于上一列同行园区的路径数
                else if (j == 0) {
                    dp[i][j] = dp[i - 1][j];
                }
                // 对于其他园区,其路径数等于上一行同列园区路径数加上上一列同行园区路径数
                else {
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
            // 当前园区不可参观时,路径数为0
            else {
                dp[i][j] = 0;
            }
        }
    }

    // 输出从起始园区到终点园区的不同参观路径数量
    printf("%d\n", dp[m - 1][n - 1]); // 结束位置是(m-1, n-1),即右下角园区

    return 0; // 程序执行成功返回0
}

这段代码通过动态规划的方法解决了给定问题。它首先读取矩形园区的大小以及每个园区的可访问性,然后使用二维数组dp来记录从左上角到达每个园区的不同路径数量,并根据当前位置相对于上一行或上一列园区的关系来递推计算路径数。最后输出从左上角到右下角的路径总数。

文章目录

    • 题目描述
    • 输入描述
    • 输出描述
    • 用例
    • 思路
    • 代码


http://www.niftyadmin.cn/n/5387137.html

相关文章

LeetCode494. Target Sum——01背包

文章目录 一、题目二、题解 一、题目 You are given an integer array nums and an integer target. You want to build an expression out of nums by adding one of the symbols ‘’ and ‘-’ before each integer in nums and then concatenate all the integers. For …

高院司法观点、法官评析等一键获取,海量数据尽在Alpha法律智能操作系统

近期&#xff0c;最高人民法院相关部门的负责人在接受记者提问时&#xff0c;提到&#xff1a;“人民法院审理案件时必须查阅案例库&#xff0c;参考入库同类案例进而作出裁判&#xff0c;这样做的目的是可以做到保障法律的适用统一、裁判尺度统一&#xff0c;有效地避免出现‘…

shell脚本实现Mysql分库分表备份

一.数据库的分库分表&#xff1f; 12张图把分库分表讲的明明白白&#xff01;阿里面试&#xff1a;我们为什么要分库分表https://mp.weixin.qq.com/s?__bizMzU0OTE4MzYzMw&mid2247547792&idx2&sn91a10823ceab0cb9db26e22783343deb&chksmfbb1b26eccc63b784879…

C++学习Day09之异常变量的生命周期

目录 一、程序及输出1.1 throw MyException()------catch (MyException e)1.2 throw MyException()------catch (MyException &e)1.3 throw &MyException()------catch (MyException *e)1.4 throw new MyException()------catch (MyException *e) 二、分析与总结 一、程…

运维07:堡垒机

什么是跳板机 跳板机就是一台服务器而已&#xff0c;运维人员在使用管理服务器的时候&#xff0c;必须先连接上跳板机&#xff0c;然后才能去操控内网中的服务器&#xff0c;才能登录到目标设备上进行维护和操作 开发小张 ---> 登录跳板机 ---> 再登录开发服务器 测试…

干货分享 | TSMaster 序列发送模块在汽车开发测试中的应用

众所周知&#xff0c;序列发送模块可以不需要脚本代码实现测试中特定控制报文序列的发送&#xff0c;该模块多用于循环顺序控制的测试案例中。序列发送模块的常用场景&#xff0c;主要是针对一些新开发的产品需要通过该模块来验证产品功能等等。本文重点和大家分享一下关于TSMa…

如何在OpenWRT安装内网穿透工具实现远程访问本地搭建的web网站界面

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

MySQL性能分析1——查看频次

1、查看执行频次 查看当前数据库的INSERT,UPDATE,DELETE,SELECT的访问频次&#xff0c;得到当前数据库是以插入&#xff0c;更新和删除为主还是以查询为主&#xff0c;如果是以插入&#xff0c;更新和删除为主的话&#xff0c;那么优化比重可以轻一点儿。 语法&#xff1a; …