7-10 求解矩阵最小路径和问题 (12 分)

2023-11-04

给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。求所有路径和中最小路径和。

输入格式:
首先输入行数m及列数n,接下来输入m行,每行n个数。

输出格式:
输出第一行为最小路径(假定测试数据中的最小路径唯一),第2行为最小路径和。

输入样例1:

4 4
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0

结尾无空行
输出样例1:

1 3 1 0 6 1 0 
12

知识点:

  • 动态规划

思路:

  • 大部分求最小(最大)路径和都可以用动态规划进行求解, 用数组dp[][]来存储路径和,
  • 因为只能向右和向下进行移动,所以第一行只能是通过向右移动得到的,第一列只能是上一行通过向下得到的(1,1除外)
  • 其余情况要取min(dp[i-1][j],dp[i][j-1])的最小值然后加上当前值即dp[i][j]=min(dp[i-1][j],dp[i][j-1])+a[i][j]
  • 求路径:
  • 从dp数组进行确定路径,因为路径中肯定会包括右下角和左上角,其他值是通过下移或者是右移得到的所以要对其进行判断取最小值,然后将其下标变为最小值的下标然后以此类推知道推到(1,1)结束循环(这里也要对第一行第一列进行处理)

注意事项:

  • 要考虑到第一行第一例,还有左上角和右下角,然后求路径,要想到路径的获取是从dp中确定的,因为dp中数据不是从有移就是从下移得到的,并且在这里也要考虑到第一行第一列的问题。

源码:

#include<bits/stdc++.h>
using namespace std;
int m, n;
int ans;
int u;
int a[1005][1005];
int dp[1005][1005];
int pre[1005][1005];
void dpsort() {
	for (int i = 1;i <= m;i++) {
		for (int j = 1;j <= n;j++) {
			if (i == 1 && j == 1) {
				dp[i][j] = a[i][j];
				pre[i][j] = j;
				continue;
			}	
			if (j == 1) {
				dp[i][j] = dp[i - 1][j] + a[i][j];
				pre[i][j] = j;
			}
				
			else if (i == 1)
				dp[i][j] = dp[i][j - 1] + a[i][j];
			else
				dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
		}
	}
}
void path() {
	stack<int> st;
	st.push(a[m][n]);
	int i = m;
	int j = n;
	while (i != 1 || j != 1) {
		if (i == 1) {
			st.push(a[i][j - 1]);
			j = j - 1;
		}
		else if (j == 1) {
			st.push(a[i - 1][j]); 
			i = i - 1;
		}			
		else if (dp[i][j - 1] < dp[i - 1][j]) {
			st.push(a[i][j - 1]);
			j = j - 1;
		}
		else {
			st.push(a[i - 1][j]);
			i = i - 1;
		}
	}
	while (!st.empty()) {
		int t = st.top();
		st.pop();
		printf("%d ", t);
	}
	cout << endl;
}
int main() {

	cin >> m >> n;
	for (int i = 1;i <= m;i++) {
		for (int j = 1;j <= n;j++) {
			cin >> a[i][j];
		}
	}
	dpsort();
	path();
	cout << dp[m][n];
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7-10 求解矩阵最小路径和问题 (12 分) 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • IEnumreable 动态和 lambda

    我想在 a 上使用 lambda 表达式IEnumerable
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • NotImplementedError: Could not run ‘torchvision::nms‘ with arguments from the ‘CUDA‘ backend解决办法

    NotImplementedError Could not run torchvision nms with arguments from the CUDA backend This could be because the operato
  • [项目管理-22]:项目中开环、闭环、安全、监控四种沟通模型:UDP/TCP/SCTP/PID模型

    目录 前言 第1章 项目中闭环沟通模型 1 1 沟通模型 1 2 开环沟通 1 3 闭环沟通 1 4 闭环监控式沟通 第2章 TCP UDP SCTP通信模型在项目管理中的应用 2 1 UDP模式沟通 2 2 TCP模式沟通 2 3 SCT
  • GB28181智慧可视化指挥控制系统之执法记录仪设计探讨

    什么是智慧可视化指挥控制系统 智慧可视化指挥控制平台通过4G 5G网络 WIFI实时传输视音频数据至指挥中心 特别是在有突发情况时 可以指定一台执法仪为现场视频监控器 实时传输当前画面到指挥中心 指挥中心工作人员可通过麦克风向现场执法人员下
  • golang高精度十进制数扩展包decimal用法

    在Go语言中 没有内置的十进制数 decimal 类型或相关的标准库 然而 有一些第三方包可用于处理十进制数 其中比较常用的是decimal包 decimal包提供了一个big Float的子类型decimal Decimal 可以用于表示
  • 快捷指令url大全

    支付宝付款码 alipay platformapi startapp appId 20000056 支付宝健康码 alipays platformapi startapp appId 20000067 chInfo ch desktop u
  • 两个有序链表的合并(超详细)

    不知道大家有没有做过一道经典的题目 两个长度为15的有序链表的合并 大家先看题目 那么这道题该如何做尼 首先我们用比较笨的办法 用链表做 首先我们创建两个链表 那么该如何将两个链表合并尼 只需要创建两个指针 指向两个链表 然后比较两个链表中
  • Git的一些命令行

    1 创建一个分支git branch 分支名字 2 提交git commit 3 换主支git checkout 要换到的名字那儿 4合并git merge 分支名字 合并到当前那个支上 且那个支会指向两个父节点 5 git rebase取
  • 南溪的远程桌面软件使用笔记

    1 介绍 远程桌面软件可以让我们远程操作另一个主机的用户界面 Note TeamViewer付费一次后 就会强制自动续费一年 如果取消订阅需要提前续订日期前至少28天 28天的提前期实在太长了 TeamViewer这个公司十分黑心 以后注意
  • TensorFlow 2.0深度强化学习指南

    在本教程中 我将通过实施Advantage Actor Critic 演员 评论家 A2C 代理来解决经典的CartPole v0环境 通过深度强化学习 DRL 展示即将推出的TensorFlow2 0特性 虽然我们的目标是展示Tensor
  • 单链表的基本设计及实际操作

    单链表的基本设计 C语言代码实现 1 单链表概念 设计 单链表是一种链式存取的数据结构 链表中的数据是以结点来表示的 每个结点的构成 元素 数据元素的映象 指针 指示后继元素存储位置 元素就是存储数据的存储单元 指针就是连接每个结点的地址数
  • 如何安装Apache服务

    目录 什么是Apache 第一步 关闭防火墙和安全机制 第二步 系 统 上 定 义 SELinux 最 高 级 别 第三步 导入对应的依赖包并解包 第四步 安装依赖环境 第五步 移动相关文件 第六步 编译安装 第七步 编译 第八步 备份配置
  • git 提交代码到错误分支如何解决

    IDEA 中 当我们修改代码提交后 才发现提交到了错误的分支上 这时如何处理 切换到正确的分支 在刚刚的错误提交上 右键 gt 点击 cherry pick 择优选择 push 推送代码到仓库 注 cherry pick 时 可能提示 yo
  • vue实现移动端适配方案

    vue实现移动端适配步骤如下 先安装amfe flexible和postcss pxtorem npm install amfe flexible save npm install postcss pxtorem save 在main js
  • C++ const 修饰函数

    const int fun int a 修饰返回值 int fun const int a 修饰形参 int fun int a const const成员函数 const修饰返回值 多是修饰返回值是引用类型的情况下 为了避免返回值被修改的
  • 前端基础汇总-html、css

    文章目录 1 HTML5新特性 2 HTML5语义化 3 CSS盒子模型 W3C盒子模型 标准盒模型 IE盒子模型 怪异盒模型 盒子塌陷 盒子塌陷解决方法 4 样式优先级 选择器类型 权重计算规则 比较规则 5 CSS继承 6 css 伪类
  • 剑指Offer数组专题

    剑指 Offer II 002 二进制加法 二进制 字符串转整型 给定两个 01 字符串 a 和 b 请计算它们的和 并以二进制字符串的形式输出 输入为 非空 字符串且只包含数字 1 和 0 示例 1 输入 a 11 b 10 输出 101
  • Python+Selenium自动化测试(六):测试驱动TDD

    文章目录 一 为什么要使用ddt模块 二 ddt模块 三 CSV文件处理 四 xlsx文件处理 一 为什么要使用ddt模块 测试驱动开发模式 要求开发在写业务代码的时候 先写出测试代码 同时单元测试例子决定了如何来写产品的代码 并且不断的成
  • spring mvc 2.5.6配置

    兼容公司老版本项目 必须得用spring mvc2 5 6 那么问题来了 怎么配置controller都抛出no mapping的错误 经过查文档得出以下配置 仅供参考 servlet config xml
  • 让特定软件使用独显/集显的解决方法

    今天下载OBS Studio 一款直播 录制软件 但是配置显示器捕获 输出黑屏 原因是软件需要在集显环境下运行 然而日常写图形学的弱鸡还得用独显赶ddl呢 所以我们可以给特定软件配置默认显卡 设置 gt 显示 gt 图形设置 gt 浏览 g
  • 7-10 求解矩阵最小路径和问题 (12 分)

    给定一个m行n列的矩阵 从左上角开始每次只能向右或者向下移动 最后到达右下角的位置 路径上的所有数字累加起来作为这条路径的路径和 求所有路径和中最小路径和 输入格式 首先输入行数m及列数n 接下来输入m行 每行n个数 输出格式 输出第一行为