最短路径(二维矩阵)
题目
给定一个矩阵m,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,返回所有路径中最小的路径和。
例子:
给定m如下:
1 3 5 9
8 1 3 4
5 0 6 1
8 8 4 0
路径1,3,1,0,6,1,0是所有路径中路径和最小的,所以返回12。
解法1
思路:
使用动态规划,定义 dp[M][N] , M ,N 分别代表矩阵的行和列数 dp[i][j] 表示从左上角到矩阵(i,j)位置是的最短路径和。则可知 到(i,j)位置有两种情况:1)由(i-1,j)向下走,2)由(i,j-1)向右走,所以dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+m[i][j];对于dp[0][j] 只能由 dp[0][j-1] 向右走,dp[i][0] 只能由 dp[i-1][0] 向下走。所以 dp[0][j]=dp[0][j-1]+m[0][j], dp[i][0]=dp[i-1][0]+m[i][0].
代码:
package com.ch.evaluation.TestJava;/*** @Auther: 011336* @Date: 2019/4/10 14:24*/ public class ShortestRoad {public static void main(String[] args) {int arr[][] = new int[][]{{1,3,5,9},{8,1,3,4},{5,0,6,1},{8,8,4,0}};int shortNum = getRoad(arr);System.out.println(shortNum);}public static int getRoad(int arr[][]){int dp[][]=new int [arr.length][arr[0].length];dp[0][0]=arr[0][0];for(int i=1;i<arr.length;i++){dp[i][0]=dp[i-1][0]+arr[i][0];//第一列只能由上向下 }for(int j=1;j<arr[0].length;j++){dp[0][j]=dp[0][j-1]+arr[0][j];//第一行只能由左向右 }for(int i=1;i<arr.length;i++) {for (int j = 1; j < arr[0].length; j++) {dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + arr[i][j];}}return dp[arr.length-1][arr[0].length-1];} }
解法2(优化解法1)
思路:
解法1中使用dp数组的空间大小为M*N,其实可以对dp数组的空间压缩至N,定义大小为N的dp数组,对于第一行,dp[i]=dp[i-1]+m[0][i],在求第二行中的 dp[i] 时可以覆盖第一行 dp[i] ,第二行dp[i]=Math.min(dp[i],dp[i-1])+m[i][j]。
代码
public static int shortestRoad1(int arr[][]){int dp[]=new int[arr[0].length];dp[0]=arr[0][0];for(int j=1;j<arr[0].length;j++){dp[j]=dp[j-1]+arr[0][j];//求出第一行的dp }for(int i=1;i<arr.length;i++){dp[0]=arr[i][0]+dp[0];//dp[0]代表每一行最左边的dp,//后一行的dp覆盖前一行的dpfor(int j=1;j<arr[0].length;j++){dp[j]=Math.min(dp[j-1]+arr[i][j], dp[j]+arr[i][j]);}} return dp[arr[0].length-1];}
转载于:https://www.cnblogs.com/UncleWang001/p/10824095.html
最短路径(二维矩阵)相关推荐
- 机器学习之数学基础(二)~数组、向量、矩阵、向量空间、二维矩阵
1. 概述 在学习机器学习(machine learning)或模式识别(pattern recognition)过程中,我经常会困惑于向量.数组和矩阵这三种数据结构,而在学习张学工教授<模式识 ...
- python 搜索二维矩阵
搜索二维矩阵 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入:m ...
- python 二维矩阵翻转
二维矩阵翻转 # N * N的二维矩阵 # 沿上下中线翻转 # 沿左右中线翻转 # 沿-45度对角线翻转 # 沿45度对角线翻转matrix3 = [[1, 2, 3, 4, 5], [6, 7, 8 ...
- matlab找出二维矩阵中最大值的位置或者最小值的位置
matlab寻找最大值或者最小值是通过max和min命令 对应二维矩阵寻找最大元素就是max(max(A)),注意二维矩阵要写两个max 找对应位置用find函数 举个例子: >> A=[ ...
- 20190110-用笨办法找到二维矩阵的鞍点
1:找出一个多维数组的鞍点,即该元素在该行上最大,在该列上最小,也可能没有鞍点 a = [ [1,2,3,4], [4,5,6,2], [7,0,5,2], [11,1 ...
- LeetCode 73矩阵置零74搜素二维矩阵75颜色分类
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...
- 【Matlab】如何对二维矩阵进行线性/非线性插值?
1.Introduction 最近又遇到了矩阵插值(重采样)的问题,在最开始写博客的时候就写了篇关于 Excel 重采样的文章,不过在逐渐熟悉 Matlab 的过程中,还是决定看看能不能编程自动实现, ...
- 【Matlab】一种超简单的二维矩阵降维方法
1.Introduction Matlab里图像处理时,经常会把一维数组转二维数组,二维数组转一维,如下图所示: 一般经常使用的函数是 reshape ,可以在不同维度之间进行转换,不过需要事先计算数 ...
- 二维矩阵中的最大矩形面积--java实现
一.原题: 给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积. 样例: 给你一个矩阵如下: [[1, 1, 0, 0, 1],[0, 1, 0 ...
最新文章
- 谈谈微服务设计中的API网关模式
- 求表达式1-1/2+1/3-1/4+1/5-1/6+1/7-...+1/n的值
- note js 创建项目_vue.js使用vuecli3快速创建项目
- JVM 调优实战--常用JVM命令:jps/jinfo/jstat/jmap/jstack/jhat
- java 索引排序_Java培训MySQL之排序分组优化索引的选择
- ASP.NET Core 介绍
- 转:跨dll操作fopen的返回值导致出错
- dnf如何快速拾取物品_DNF手游泰拉该如何获取,游戏蜂窝辅助托管快速获取泰拉...
- 一个wepy开发微信小程序时图片在真机上不显示的问题
- 学生管理系统(源码)(C语言版)
- 计算机代码大全,电脑运行代码大全
- 网站内链外链批量抓取工具
- FL Studio 12是什么软件?Mac音乐制作软件推荐FL Studio 12 for Mac!
- NGINX配置gzip请求自动解压
- GUARDED_BY(c) 和 PT_GUARDED_BY(c)
- 【web前端基础 | H5】HTML简介
- spring-day03-底层事务、AOP
- 最近使用的一款session工具:sa-Token
- 读书笔记 -- 《瓦尔登湖》
- 百度百科计算机科学与技术,徐明伟(清华大学计算机科学与技术系教授)_百度百科...