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

算法:动态规划 寻找2D矩阵中到达某一坐标的可能路径总数

dp基础问题: 寻找2D矩阵中到达某一坐标的可能路径总数

问题描述:

给定一个二维数组,求解从 (0, 0) 开始,访问到 (x, y) 的可能路径数量。在矩阵中,你每次只能往下或者往右移动一个单位。

问题分析:

本题的解题思路和上一篇博文类似。

由于限制条件中的只能往右或者往下移动,易得到达某坐标的最后一步为向下或者向右,这两种步骤都是到达这个坐标的方式。因此,用 numWays[i][j] 来表示到达坐标(i, j)的总路径数的话,可得公式:

numWays(i, j) = numWays(i - 1, j) + numWays[i][j - 1]

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

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

把第一种坐标拿出来分析, 由于限制条件,到达这类坐标的路径数为:

numWays(0, j) = 1

可知到达这类坐标的路径数是唯一可知的。同理最左的坐标同样是唯一可知的。

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

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

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

  // construct topmost ways
  for (let i = 1; i < x; i++) {
    numWays[0][i] = 1
  }

  // construct leftmost ways
  for (let i = 1; i < y; i++) {
    numWays[i][0] = 1
  }

  // find all ways
  for (let i = 1; i < x; i++) {
    for (let j = 1; j < y; j++ ) {
      numWays[i][j] = numWays[i - 1][j] + numWays[i][j - 1]
    }
  }
  
  return numWays[x - 1][y - 1]
}

相关文章:

  • 算法:动态规划 寻找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 演算中的函数 柯里化
  • 【Programming Languages And Lambda calculi】4.2 Lambda演算的语法与约化
  • Android开源项目规范总结
  • Iterator 和 for...of 循环
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Linux快速复制或删除大量小文件
  • rc-form之最单纯情况
  • Selenium实战教程系列(二)---元素定位
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 安装python包到指定虚拟环境
  • 前端临床手札——文件上传
  • 问题之ssh中Host key verification failed的解决
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ionic入门之数据绑定显示-1
  • #1015 : KMP算法
  • #define,static,const,三种常量的区别
  • #include<初见C语言之指针(5)>
  • $(function(){})与(function($){....})(jQuery)的区别
  • $.proxy和$.extend
  • $L^p$ 调和函数恒为零
  • $refs 、$nextTic、动态组件、name的使用
  • (30)数组元素和与数字和的绝对差
  • (SpringBoot)第七章:SpringBoot日志文件
  • (分布式缓存)Redis分片集群
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (转)大道至简,职场上做人做事做管理
  • (转)我也是一只IT小小鸟
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core 中的路径问题
  • .net web项目 调用webService
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .so文件(linux系统)
  • @DateTimeFormat 和 @JsonFormat 注解详解