当前位置: 首页 > news >正文

算法: 动态规划 寻找2D矩阵中到达某一坐标的最小代价路径

dp基础问题: 寻找2D矩阵中到达某一点的最小代价路径

问题描述:

给定一个二维数组 Cost[i][j] 表示访问坐标为 (i, j) 的代价。求解从 (0, 0) 开始,访问到 (x, y) 的最小代价。在矩阵中,你每次只能往下或者往右移动一个单位。且所有代价都是正整数。

问题分析:

由于限制条件中的只能往右或者往下移动,易得到达某坐标的最小代价公式可写作:

MinCost(i, j) = min(MinCost(i - 1, j), MinCost(i, j - 1)) + Cost[i][j]

现在继续分解问题,从坐标(0, 0)开始移动,可以注意到有两种特殊的坐标:

  1. 横坐标为0的坐标,即最上方(topmost)的坐标
  2. 纵坐标为0的坐标,即最左边(leftmost)的坐标

把第一种坐标拿出来分析, 由于限制条件,这类坐标的代价为:

MinCost(0, j) = MinCost(0, j - 1) + Cost[0,j]

可知到达这类坐标的代价是唯一可知的。同理最左的坐标同样是唯一可知的。

而知道矩阵最外两边的坐标代价之后,通过层层往里的最小代价求解,可逐个求出所有坐标的最小代价。

因此,需要的所有信息都已经得到,可以开始写解法了。

算法:
/**
 * 
 * @param {int[][]} Cost 
 * @param {int} x 
 * @param {int} y 
 */
var twodimensional = function(Cost, x, y) {
  // construc MinCost dp 2-dimensional-matrix
  var MinCost = new Array()
  for (let i = 0; i < y; i++) {
    a[i] = new Array()
    for (let j = 0; j < x; j++) {
      a[i][j] = 0
    }
  }
  MinCost[0][0] = Cost[0][0]

  // construct topmost cost
  for (let i = 1; i < x; i++) {
    MinCost[0][i] = MinCost[0][i - 1] + Cost[0][i]
  }

  // construct leftmost cost
  for (let i = 1; i < y; i++) {
    MinCost[i][0] = MinCost[i - 1][0] + Cost[i][0]
  }

  // find all the cost
  for (let i = 1; i < x; i++) {
    for (let j = 1; j < y; j++ ) {
      MinCost[i][j] = Math.min(MinCost[i - 1][j], MinCost[i][j - 1]) + Cost[i][j]
    }
  }
  
  return MinCost[x - 1][y - 1]
}

我们用到的是由底往上(Bottom-Top)的动态解决方法,如果你有不懂的地方,欢迎评论,我会尽力为你解答。

相关文章:

  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数
  • 算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数进阶版(添加路障)
  • 算法: 动态规划,二维矩阵代价最值进阶版 两条行进路径,一次相交,求解最大代价
  • Programming Languages And Lambda calculi 1.1 定义集合
  • 算法: 动态规划 编辑距离 Edit Distance / Levenshtein Distance
  • 【Salesforce】【Apex】Trigger中不通过soql查询记录类型的开发名称
  • 【Programming Languages And Lambda calculi】 1.2 ~ 1.3 关系、赋值与关系
  • 【Programming Languages And Lambda calculi】 1.4 有向赋值
  • 【算法】 动态规划 基础题库 1-7 python实现
  • 【Programming Languages And Lambda calculi】 1.5 ~ 1.7 上下文规约 赋值函数 符号摘要
  • 【Programming Languages And Lambda calculi】第二章 结构归纳法 2.1 基础
  • 【Programming Languages And Lambda calculi】2.2 ~ 2.3 定义中的省略,证明树中的归纳
  • 【Programming Languages And Lambda calculi】2.4 ~ 2.5 多重结构,更多的定义与证明 第二章结束
  • 【Programming Languages And Lambda calculi】第三章 求值一致性 Church-Rosser 关系 (本章仅一节)
  • 【Programming Languages And Lambda calculi】第四章 Lambda演算 / Lambda表达式 4.1 演算中的函数 柯里化
  • Fundebug计费标准解释:事件数是如何定义的?
  • Js基础知识(一) - 变量
  • log4j2输出到kafka
  • Netty源码解析1-Buffer
  • PHP面试之三:MySQL数据库
  • Promise面试题2实现异步串行执行
  • Spark RDD学习: aggregate函数
  • SpingCloudBus整合RabbitMQ
  • SQLServer插入数据
  • Webpack 4 学习01(基础配置)
  • 给新手的新浪微博 SDK 集成教程【一】
  • 构建工具 - 收藏集 - 掘金
  • 回流、重绘及其优化
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 详解NodeJs流之一
  • 再次简单明了总结flex布局,一看就懂...
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • (11)MATLAB PCA+SVM 人脸识别
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (day 12)JavaScript学习笔记(数组3)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)四层和七层负载均衡的区别
  • (转)为C# Windows服务添加安装程序
  • .gitignore文件设置了忽略但不生效
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET 常见的偏门问题
  • .net6使用Sejil可视化日志
  • /etc/skel 目录作用
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • /var/lib/dpkg/lock 锁定问题
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @GetMapping和@RequestMapping的区别
  • @JoinTable会自动删除关联表的数据
  • @Query中countQuery的介绍
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [ 数据结构 - C++] AVL树原理及实现