【算法设计与分析】求解矩阵最小路径和问题

这篇具有很好参考价值的文章主要介绍了【算法设计与分析】求解矩阵最小路径和问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

《算法设计与分析》的实验,稍微记录一下,欢迎讨论。


题目描述

给定一个m行n列的矩阵,从左上角开始每次只能向右或者向下移动,最后到达右下角的位置,路径上的所有数字累加起来作为这条路径的路径和。编写一个实验程序求所有路径和中的最小路径和。例如,一下矩阵中的路径1→3→1→0→6→1→0是所有路径中路径和最小的,返回结果是12:

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

解题思路

将矩阵用二维数组data存放,查找从左上角到右下角的路径,每次只能向右或者向下移动,所以结点(i,j)的前驱结点只有(i,j - 1)和(i - 1,j)两个,前者是水平走向,后者是垂直走向。
用二维数组dp作为动态规划数组,dp[i][j]表示从顶部data[0][0]查找到(i,j)结点时的最小路径和。显然这里有两个边界,即第一列和第一行,达到它们中结点的路径只有一条而不是常规的两条。
状态转移方程如下:
dp[0][0] = data[0][0]
dp[i][0] = dp[i - 1][0] + data[i][0] // 考虑第一列的边界,1 ≤ i ≤ m - 1
dp[0][j] = dp[0][j - 1] + data[0][j] // 考虑第一行的边界,1 ≤ j ≤ n - 1
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j]) + data[i][j] // 其他有两条达到路径的结点

求出的dp[m - 1][n - 1]就是最终的结果。
为了求最小路径和,设计一个二维数组pre,pre[i][j]表示查找到(i,j)结点时最小路径上的前驱结点,由于前驱结点只有水平和垂直两个走向,pre[i][j]根据路径走向取1(水平)或者0(垂直)。
在求出ans后,通过pre[m - 1][n - 1]反推求出反向路径,最后正向输出该路径即可。


参考代码

#include <iostream>
#include <vector>
using namespace std;
#define MAXM 100
#define MAXN 100
// 问题表示
int data[MAXM][MAXN] = {{1, 3, 5, 9}, {8, 1, 3, 4}, {5, 0, 6, 1}, {8, 8, 4, 0}};
int m = 4, n = 4;
// 求解结果表示
int dp[MAXM][MAXN];  // 动态规划数组
int pre[MAXM][MAXN];  // 记录前驱结点
int ans;  // 最小路径长度
// 求最小路径和ans
void miniPath() {
	dp[0][0] = data[0][0];
	for(int i = 1; i < m; i++) {  // 计算第一列的值
		dp[i][0] = dp[i - 1][0] + data[i][0];
		pre[i][0] = 0;  // 垂直路径
	}
	for(int j = 1; j < n; j++) {  // 计算第一行的值
		dp[0][j] = dp[0][j - 1] + data[0][j];
		pre[0][j] = 1;  // 水平路径
	}
	for(int i = 1; i < m; i++) {  // 计算其他的值
		for(int j = 1; j < n; j++) {
			if(dp[i][j - 1] < dp[i - 1][j]) {
				dp[i][j] = dp[i][j - 1] + data[i][j];
				pre[i][j] = 1;
			} else {
				dp[i][j] = dp[i - 1][j] + data[i][j];
				pre[i][j] = 0;
			}
		}
	}
	ans = dp[m - 1][n - 1];
}
// 输出最小路径和
void disPath() {
	int i = m - 1, j = n - 1;
	vector<int> path;  // 存放反向最小路径
	vector<int>::reverse_iterator it;  // 创建迭代器
	while(1) {
		path.push_back(data[i][j]);
		if(i == 0 && j == 0) break;
		if(pre[i][j] == 1) j--;  // 同行
		else i--;  // 同列
	}
	printf("\t最短路径:");
	for(it = path.rbegin(); it != path.rend(); ++it) printf("%d ", *it);  // 反向输出构成正向路径
	printf("\n\t最短路径和:%d\n", ans);  // 输出最短路径和
}

int main (void) {
	miniPath();
	printf("求解结果\n");
	disPath();
	return 0;
}

总结

动态规划最主要的是写出状态转移方程,我觉得这个是最难的,其次是优化问题,将二维的dp数组转化为一维的dp数组。文章来源地址https://www.toymoban.com/news/detail-482327.html

到了这里,关于【算法设计与分析】求解矩阵最小路径和问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划问题——矩阵的最小路径和

    题目: 给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。 示例: 给定的m如下: 1        3         5        9 8        1        3        4  5        0        6 

    2023年04月08日
    浏览(48)
  • 计算机算法分析与设计(22)---回溯法(最小重量机器设计问题)

     设某一机器由 n n n 个部件组成,每种部件都可以从 m m m 个不同的供应商处购得。设 w i j w_{ij} w ij ​ 是从供应商 j j j 处购得的部件i的重置, c i j c_{ij} c ij ​ 是相应的价格。设计一个算法,给出总价格不超过 d d d 的最小重量机器设计。 数据输入: 第 1 1 1 行有 3 3 3 个正整

    2024年02月06日
    浏览(44)
  • 【路径规划matlab代码】基于遗传算法求解机器人栅格地图路径规划问题

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进, 代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信    

    2024年03月08日
    浏览(68)
  • 【路径规划】基于遗传算法求解机器人栅格地图路径规划问题matlab代码

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进, 代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信    

    2024年01月24日
    浏览(64)
  • 遗传算法求解车辆路径优化问题VRP(Python代码实现)

    学会了前面两篇遗传算法,但是那都是针对抽象的数学问题求解的,那么应用到现实中的实际问题中,我们又该怎样把遗传算法套进去呢,然后我第一个接触到的问题就是车辆路径优化问题VRP,当然也是找到了一篇比较好的文章,物流管理论文实现:基于遗传算法的带时间窗

    2024年01月18日
    浏览(47)
  • 基于遗传算法求解机器人栅格地图路径规划问题matlab仿真

     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进, 代码获取、论文复现及科研仿真合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab完整代码及仿真定制内容点击👇 智能优化算法       神经网络预测       雷达通信    

    2024年01月22日
    浏览(57)
  • 【算法题】螺旋矩阵I (求解n阶螺旋矩阵问题)

    一、问题的提出 螺旋矩阵是一种常见的矩阵形式,它的特点是按照螺旋的方式排列元素。n阶螺旋矩阵是指矩阵的大小为n×n,其中n为正整数。   二、解决的思路 当N=1时,矩阵为; 当N=2时,矩阵为; 当N2(N为偶数如N=4)时,矩阵为; 当N2(N为奇数如N=5)时,矩阵为。 图1 螺旋矩阵分

    2024年02月13日
    浏览(42)
  • VRPTW:新雀优化算法NOA求解带时间窗的车辆路径问题

    1.1VRPTW模型如下: 带时间窗的车辆路径问题(Vehicle Routing Problem with Time Windows, VRPTW) 1.2 新雀优化算法NOA求解 VRPTW 部分结果: 配送路线1:0-2-21-10-0 服务顾客数量:3 路径长度:96.65542 装载量:34 服务顾客2的起始时间:18.00000,结束时间:28.00000 服务顾客21的起始时间:38.44031,结束

    2024年02月01日
    浏览(39)
  • 整数规划——分支界定算法(旅行商问题,规约矩阵求解)

    一、普通优化问题分枝定界求解 题目的原问题为   在计算过程中,利用MATLAB中的linprog()函数进行求解最优解,具体的计算步骤如下: A为约束系数矩阵,B为等式右边向量,C为目标函数的系数向量。   进行第一次最优求解以A=[2 9;11 -8],B=[40;82],C=[-3,-13]利用linprog函数求解。解

    2024年02月16日
    浏览(37)
  • 利用最小二乘法求解相机投影矩阵

    1、相机成像几何模型的建立 为了得到三维空间物体表面某点的几何位置与其所在二维平面图像中对应点之间的相关关系,需要建立相机成像的几何模型。 为了建立几何模型,首先需要构建几个重要的坐标系: 世界坐标系(World Coordinate):在环境中建立的三维坐标系,用来

    2024年02月05日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包