矩阵中从左上角到右下角最短路径(五种方法)

本文介绍了从矩阵左上角到右下角寻找元素之和最小路径的五种方法,包括转换为图中最短路径的Dijkstra算法,以及四种动态规划解决方案。这些方法的时间复杂度和空间复杂度各不相同,从O(n*m)到O(n*m*m*m),并且有的方法允许修改矩阵原值以优化空间效率。
摘要由CSDN通过智能技术生成
  题目:给定一个n*m的矩阵,矩阵中元素非负,从左上角到右下角找一条路径,使得路径上元素之和最小,每次只能向右或者向下走一个方格。如下图所示:最短路径是图中绿色部分的元素。

  方法一(转换为图中的最短路径):我们可以把矩阵中的每个方格当做图中的一个顶点,相邻的方格之间有一条边,每个方格最多有两条出边,(当前方格到右侧方格有一条出边,当前方格到下侧方格有一条出边)。我们把矩阵中的最短路径转换为图中的最短路径,使用Dijstra算法来做此题,我们再次使用最简单的Dijstra算法,没有进行优化。图中总共有n*m个点,因为每一次都需要找到一个最小值,找最小值得代价为o(n*m),总共需要找o(n*m)个最小值,所以时间复杂度为o(n*n*m*m)。
struct Node
{
	int val;
	int row;
	int col;
	Node(){}
	Node(int v, int r, int c) :val(v), row(r), col(c)
	{}
	friend bool operator<(const Node &lhs, const Node &rhs);
};

bool operator<(const Node &lhs, const Node &rhs)
{
	return lhs.val > rhs.val;
}

struct Vertex
{
	int dis;
	bool visited;
	Vertex(){}
	Vertex(int d, bool v) :dis(d), visited(v){}
};

class Solution {
public:
    Node findMinVal(vector<vector<Vertex>> ve)
    {
    	Node res = Node(INT_MAX, 0, 0);
    	for (int i = 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值