题目
给定一个矩阵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. 机器学习之数学基础(二)~数组、向量、矩阵、向量空间、二维矩阵

    1. 概述 在学习机器学习(machine learning)或模式识别(pattern recognition)过程中,我经常会困惑于向量.数组和矩阵这三种数据结构,而在学习张学工教授<模式识 ...

  2. python 搜索二维矩阵

    搜索二维矩阵 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入:m ...

  3. python 二维矩阵翻转

    二维矩阵翻转 # N * N的二维矩阵 # 沿上下中线翻转 # 沿左右中线翻转 # 沿-45度对角线翻转 # 沿45度对角线翻转matrix3 = [[1, 2, 3, 4, 5], [6, 7, 8 ...

  4. matlab找出二维矩阵中最大值的位置或者最小值的位置

    matlab寻找最大值或者最小值是通过max和min命令 对应二维矩阵寻找最大元素就是max(max(A)),注意二维矩阵要写两个max 找对应位置用find函数 举个例子: >> A=[ ...

  5. 20190110-用笨办法找到二维矩阵的鞍点

    1:找出一个多维数组的鞍点,即该元素在该行上最大,在该列上最小,也可能没有鞍点 a = [     [1,2,3,4],     [4,5,6,2],     [7,0,5,2],     [11,1 ...

  6. LeetCode 73矩阵置零74搜素二维矩阵75颜色分类

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  7. 【Matlab】如何对二维矩阵进行线性/非线性插值?

    1.Introduction 最近又遇到了矩阵插值(重采样)的问题,在最开始写博客的时候就写了篇关于 Excel 重采样的文章,不过在逐渐熟悉 Matlab 的过程中,还是决定看看能不能编程自动实现, ...

  8. 【Matlab】一种超简单的二维矩阵降维方法

    1.Introduction Matlab里图像处理时,经常会把一维数组转二维数组,二维数组转一维,如下图所示: 一般经常使用的函数是 reshape ,可以在不同维度之间进行转换,不过需要事先计算数 ...

  9. 二维矩阵中的最大矩形面积--java实现

    一.原题: 给你一个二维矩阵,权值为False和True,找到一个最大的矩形,使得里面的值全部为True,输出它的面积. 样例: 给你一个矩阵如下: [[1, 1, 0, 0, 1],[0, 1, 0 ...

最新文章

  1. 谈谈微服务设计中的API网关模式
  2. 求表达式1-1/2+1/3-1/4+1/5-1/6+1/7-...+1/n的值
  3. note js 创建项目_vue.js使用vuecli3快速创建项目
  4. JVM 调优实战--常用JVM命令:jps/jinfo/jstat/jmap/jstack/jhat
  5. java 索引排序_Java培训MySQL之排序分组优化索引的选择
  6. ASP.NET Core 介绍
  7. 转:跨dll操作fopen的返回值导致出错
  8. dnf如何快速拾取物品_DNF手游泰拉该如何获取,游戏蜂窝辅助托管快速获取泰拉...
  9. 一个wepy开发微信小程序时图片在真机上不显示的问题
  10. 学生管理系统(源码)(C语言版)
  11. 计算机代码大全,电脑运行代码大全
  12. 网站内链外链批量抓取工具
  13. FL Studio 12是什么软件?Mac音乐制作软件推荐FL Studio 12 for Mac!
  14. NGINX配置gzip请求自动解压
  15. GUARDED_BY(c) 和 PT_GUARDED_BY(c)
  16. 【web前端基础 | H5】HTML简介
  17. spring-day03-底层事务、AOP
  18. 最近使用的一款session工具:sa-Token
  19. 读书笔记 -- 《瓦尔登湖》
  20. 百度百科计算机科学与技术,徐明伟(清华大学计算机科学与技术系教授)_百度百科...

热门文章

  1. Maven web项目的项目如何创建
  2. SQLSERVER之快速掌握T-SQL语句
  3. 输入n求N*N矩阵,规定矩阵沿45度线递增
  4. ASP.NET 学习笔记
  5. busybox date 时间的加减
  6. [Java] 蓝桥杯BASIC-18 基础练习 矩形面积交
  7. 蓝桥杯 ALGO-141 算法训练 P1102
  8. LeetCode 357. Count Numbers with Unique Digits
  9. LeetCode383. Ransom Note
  10. python django 优势_为什么选择Django?