一、牛客 NC59 矩阵的最小路径和

给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。

数据范围: 1≤n,m≤500,矩阵中任意值都满足 0 ≤ a(i,j) ≤100
要求:时间复杂度 O(nm)O(nm)

例如:当输入[[1,3,5,9],[8,1,3,4],[5,0,6,1],[8,8,4,0]]时,对应的返回值为12,
所选择的最小累加和路径如下图所示:

public int minPathSum (int[][] matrix) {int[] dp = new int[matrix[0].length];dp[0] = matrix[0][0];for(int i = 1; i < matrix[0].length; i++){dp[i] = dp[i-1] + matrix[0][i];}for(int i = 1; i < matrix.length; i++){for(int j = 0; j < dp.length; j++){if(j == 0){dp[j] = dp[j] + matrix[i][j];continue;}dp[j] = Math.min(dp[j], dp[j-1]) + matrix[i][j];}}return dp[dp.length - 1];
}

或者

public int minPathSum (int[][] matrix) {int m = matrix.length;int n = matrix[0].length;int dp[][] = new int[m][n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(i==0&&j==0){dp[0][0]=matrix[0][0];}else if(i==0){dp[i][j] = matrix[i][j] + dp[i][j-1];}else if(j==0){dp[i][j] = matrix[i][j] + dp[i-1][j];}else{dp[i][j]= matrix[i][j] + Math.min(dp[i-1][j],dp[i][j-1]);}}}return dp[m-1][n-1];
}

二、最短路径

给定一个矩阵,从上到下找到最短路径, 第一行任意位置开始,只能往下走(包含对角线)

矩阵:
{1, 3, 5, 9},
{8, 1, 3, 4},
{5, 0, 6, 1},
{8, 8, 4, 0}
结果输出: 6
解析:
因为路径1->1->0->4 为最短路径,
{1, 3, 5, 9},
{8, 1, 3, 4},
{5, 0, 6, 1},
{8, 8, 4, 0}
变化过程为:
[1, 3, 5, 9]
[9, 2, 6, 9]
[7, 2, 8, 7]
[10, 10, 6, 7]

 public static int getMinPath(int nums[][]) {if (nums == null || nums.length == 0 || nums[0] == null || nums[0].length == 0) {return 0;}int[][] dp = new int[nums.length][nums[0].length];// 第一行不变,后面每一行只需要关注它的上一行就行,结果就是dp最后一行中的最小值for (int i = 0; i < nums[0].length; i++) {dp[0][i] = nums[0][i];}for (int i = 1; i < nums.length; i++) {for (int j = 0; j < nums[0].length; j++) {if (j == 0) {dp[i][j] = Math.min(dp[i - 1][j] + nums[i][j], dp[i - 1][j + 1] + nums[i][j]);} else if (j == nums[0].length - 1) {dp[i][j] = Math.min(dp[i - 1][j] + nums[i][j], dp[i - 1][j - 1] + nums[i][j]);} else {dp[i][j] = Math.min(dp[i - 1][j] + nums[i][j], Math.min(dp[i - 1][j + 1] + nums[i][j], dp[i - 1][j - 1] + nums[i][j]));}}//System.out.println(Arrays.toString(dp[i]));}int min = dp[nums.length - 1][0];for (int i = 0; i < nums[0].length; i++) {if (dp[nums.length - 1][i] < min) {min = dp[nums.length - 1][i];}}return min;
}

动态规划-矩阵中的最短路径相关推荐

  1. Leetcode1091_二进制矩阵中的最短路径(Java+BFS解法)

    Leetcode1091题:二进制矩阵中的最短路径(Java+BFS解法) 文章目录 Leetcode1091题:二进制矩阵中的最短路径(Java+BFS解法) 1.题目链接 2.解题思想 3.Jav ...

  2. 剑指offer之矩阵中的最短路径

    题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...

  3. 动态规划——矩阵中的最短路径长度

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 题目 假设我们有一个 n 乘以 n 的矩阵 w[n][n].矩阵存储的都是正整数.棋子起始位置在左上角, ...

  4. C++算法学习(力扣:1091. 二进制矩阵中的最短路径)

    在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, -, C_k 组成: 相邻单 ...

  5. leetcode -- 1091. 二进制矩阵中的最短路径

    在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k 组成: 相 ...

  6. leetcode1091. 二进制矩阵中的最短路径(bfs)

    在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1).一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k 组成:相邻单 ...

  7. LeetCode 1091. 二进制矩阵中的最短路径(BFS)

    1. 题目 在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径, 由满足下述条件的单元格 C_1, C_2, ..., C_ ...

  8. LeetCode 1091 二进制矩阵中的最短路径问题[BFS 队列] HERODING的LeetCode之路

    解题思路: 使用广度优先遍历的方法,可以遍历下一步能走的位置,一般用到广度优先就离不开队列,队列存储着当前轮次能够走的位置,每一轮都要将能走的长度++,如果队列无元素,说明无处可走,此时没有到终点就直 ...

  9. LeetCode #1091 二进制矩阵中的最短路径

    题目描述 在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1). 一条从左上角到右下角.长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, ..., C_k ...

最新文章

  1. oracle xtts 介绍,oracle_rman_xtts_v3
  2. 为什么选择图形数据库,为什么选择Neo4j?
  3. Java中的享元设计模式,涨姿势了!
  4. Spring-注入方式(基于xml方式)
  5. python不能分配给操作员_Python:无法分配给li
  6. 二、数据预处理——缺失值处理
  7. Android系列之网络(二)----HTTP请求头与响应头
  8. CTA策略02_boll
  9. 正版Fiddler下载地址
  10. 线性同余算法 (LCG)
  11. CodeForces - 988D(思维STL)
  12. 获取 jquery 版本号
  13. PDMan-国产免费通用数据库建模工具(极简,漂亮)
  14. 打造更安全的视频加密,云点播版权保护实践
  15. 辣椒app软件测试,testflight辣椒视频APP
  16. 【校园卡】2020校园卡最近消息,电信联通默认都增加10G全国流量
  17. kotlin 属性重载
  18. 超详细讲解OSPF中如何选举DR和BDR
  19. Win10的Git中文文件名繁体火星文乱码问题
  20. Hapi入门--独立路由

热门文章

  1. 好马应不应该吃回头草?
  2. 黑白棋游戏源代码分析
  3. 金融时间序列分析:1. 基础知识
  4. linux软件包管理(RPM)简单介绍
  5. 14 款好用的 iOS 开发工具
  6. iOS开发之内存泄漏检测工具-Leaks
  7. 计算机图像技术及其应用,计算机图像处理技术的研究与应用
  8. ofo创始人戴威:两年前如何起死回生?
  9. java连接Zookeeper,获取节点数据报错
  10. 【Proteus仿真】【STM32单片机】智能温控风扇设计