DAY39: 动态规划不同路径问题62

Leetcode: 62 不同路径

机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。

基本思路

1、确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

2、确定递推公式

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

3、dp数组的初始化

dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。

时间复杂度:O(m × n)

空间复杂度:O(m × n)

想不出来的时候,可以想想最后的步骤是由上一步怎么导出的。

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n,0));//初始化二维向量for(int i = 0; i < m; i++){dp[i][0] = 1;//初始化起始} for(int i = 0; i < n; i++){dp[0][i] = 1;}for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){dp[i][j] = dp[i - 1][j]+ dp[i][j - 1];//递推公式}}return dp[m - 1][n - 1];}
};

当然也可以使用数论的方法。最后获得组合的方法如下。

C_{m+n-2}^{m-1}

但是这道题目要防止两个int相乘出现溢出的情况,所以要对两数相乘做特殊处理。需要在计算分子的时候,不断除以分母。

代码如下

代码随想录

时间复杂度:O(m)

空间复杂度:O(1)

class Solution {
public:int uniquePaths(int m, int n) {long long numerator = 1; // 分子int denominator = m - 1; // 分母int count = m - 1;int t = m + n - 2;while (count--) {numerator *= (t--);while (denominator != 0 && numerator % denominator == 0) {numerator /= denominator;denominator--;}}return numerator;}
};

Leetcode: 63 不同路径 II

这道题与上道题不一样的点,在于现在的的路径出现了障碍物。

1、dp数组的初始化

dp[i][0]一定都是1,但是如果遇到障碍物,那么后面的所有数组都是0,是无法达到的道路。

2、确定递推公式

想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1]。所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。如果出现障碍物,就跳过元素,这样这个元素还是0,那么即使相加相当于只有一个方向的信息。因此我们的递推公式还是dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。遇到障碍物之后都是0。

时间复杂度:O(n × m)

空间复杂度:O(n × m)

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();//注意维度的选择vector<vector<int>> dp(m, vector<int>(n,0));if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0return 0;for(int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;for(int i = 0; i < n && obstacleGrid[0][i] == 0; i++) dp[0][i] = 1;for(int i = 1; i < m; i++){for(int j = 1; j < n; j++){if(obstacleGrid[i][j] == 1) continue;dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/667438.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合Flowable最新教程(二)启动流程

介绍 文章主要从SpringBoot整合Flowable讲起&#xff0c;关于Flowable是什么&#xff1f;数据库表解读以及操作的Service请查看SpringBoot整合Flowable最新教程&#xff08;一&#xff09;&#xff1b;   其他说明&#xff1a;Springboot版本是2.6.13&#xff0c;java版本是1…

【QT+QGIS跨平台编译】之二十:【xerces+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、xerces介绍二、文件下载三、文件分析四、pro文件五、编译实践一、xerces介绍 Xerces是一个开源的XML解析器,由Apache软件基金会维护。它是用Java语言编写的,提供了对XML文档进行解析、验证和操作的功能。Xerces具有高性能和广泛的兼容性,可用于各种Java应用程…

Sentinel应用笔记

概念 当A、B、G、H掉线&#xff0c;其他服务就没法通信了 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点&#xff0c;从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。 特性…

Java 错误 java.net.MalformedURLException: No Protocol

我们将研究 Java 中的错误 java.net.MalformedURLException: no protocol。 为什么会发生这种错误&#xff0c;以及我们如何解决该错误。 Java 中的 java.net.MalformedURLException: no protocol 错误 当我们的 URL 出现问题时&#xff0c;会出现 java.net.MalformedURLExcep…

Vue3.0(二):Vue组件化基础 - 脚手架

Vue组件化基础 - 脚手架 Vue的组件化 我们在处理一些任务量比较庞大的工作时候&#xff0c;会将工作内容进行拆分&#xff0c;分步骤完成 而组件化的思想正式如此&#xff0c;对于一个庞大的项目&#xff0c;我们可以将其拆分成一个个的小功能&#xff0c;分步骤进行实现 组…

一知半解,临时解决ajax跨域请求

在学习java编写接口。写好之后用vue写了个前端进行测试&#xff0c;结果总是有Access-Control-Allow-Origin错误。 上网找&#xff0c;说在vue.config.js做配置,加上以下内容&#xff1a; module.exports {devServer: {port : 8089,proxy: {/mytest: {target: http://192.16…

MySQL数据库基础第二篇(函数)

文章目录 一、函数介绍二、字符串函数1.练习代码2.读出结果 三、数值函数1.练习代码2.读出结果 四、日期函数1.练习代码2.读出结果 五、流程控制函数1.练习代码2.读出结果 在当代技术世界中&#xff0c;掌握数据库设计和操作的知识和技能&#xff0c;尤其是对SQL的理解&#xf…

react 之 useInperativeHandle

useInperativeHandle是通过ref暴露子组件中的方法 1.场景说明-直接调用子组件内部的方法 import { forwardRef, useImperativeHandle, useRef } from "react"// 子组件const Son forwardRef((props, ref) > {// 实现聚焦逻辑const inputRef useRef(null)const …

【C++】C++入门 — 类和对象初步介绍

类和对象 1 类的作用域2 类的实例化3 类对象模型4 this指针介绍&#xff1a;特性&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 类的作用域 类定义了一个新的作用域&#xff0c;类的…

openGauss学习笔记-213 openGauss 性能调优-总体调优思路

文章目录 openGauss学习笔记-213 openGauss 性能调优-总体调优思路213.1 调优思路概述213.2 调优流程 openGauss学习笔记-213 openGauss 性能调优-总体调优思路 213.1 调优思路概述 openGauss的总体性能调优思路为性能瓶颈点分析、关键参数调整以及SQL调优。在调优过程中&…

【递归】 92. 反转链表 II

92. 反转链表 II 解题思路 定义了单链表节点的数据结构&#xff0c;包含整数值 val 和指向下一个节点的引用 next。 在 Solution 类中&#xff0c;定义了一个类变量 successor&#xff0c;用于保存当前节点的后继节点。 实现了 reverseBetween 方法&#xff0c;该方法通过递…

uniapp 高德地图显示

1. uniapp 高德地图显示 使用前需到**高德开放平台&#xff08;https://lbs.amap.com/&#xff09;**创建应用并申请Key   登录 高德开放平台&#xff0c;进入“控制台”&#xff0c;如果没有注册账号请先根据页面提示注册账号   打开 “应用管理” -> “我的应用”页面…

vue 渲染多列表格,拖动加载

vue在使用el-table渲染多列&#xff08;几千列&#xff09;表格时&#xff0c;页面会十分卡顿&#xff0c;使用html原生表格拖动滚动条加载列&#xff0c;可以解决这个问题 后端接口返回的数据格式如下&#xff1a; line_data中的数据title对应index_title里的内容 <temp…

diffusers代码梳理总结

常用类 这里总结一些频繁用到的支持类。 from dataclasses import dataclass from ..utils import BaseOutput from collections import OrderedDictclass BaseOutput(OrderedDict):...dataclass class Unet2DOutput(BaseOutput):"""The output of [Unet2DMod…

Linux---yum命令详解

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.概念2.yum的配置信…

【开源】WordPress一键崩溃宕机插件(整活娱乐)

插件介绍 可一键实现Wordpress崩溃宕机的整活向插件&#xff08;请勿用于非法途径&#xff0c;仅供整活娱乐&#xff09;。鼓励关注网站性能的提升&#xff0c;以提供更好的用户体验&#xff0c;提倡为用户提供良好体验和高效速度的原则。 介绍 长期以来&#xff0c;人们都在…

【webrtc】跟webrtc学list遍历

m98 代码:RTT G:\CDN\rtcCli\m98\src\video\call_stats.cc遍历list 进行删除 :remove_if void RemoveOldReports(int64_t now, std::list<CallStats::RttTime>* reports) {static constexpr const <

算法训练|乘积最大数组、最长有效括号

152. 乘积最大子数组 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a;解题思路是需要维护一个最大值以及一个最小值&#xff0c;因为最小值如果是负数的话乘上接下来的一个负数会有可能成为最大的数 代码&#xff1a; class Solution { public:int maxProduct(vec…

【Vue】3-1、Vue 3 简介

一、Vue 3 的优势 Vue 2 Options API 的缺陷&#xff1a; 一个功能往往需要在不同的 vue 配置项中定义属性和方法&#xff0c;比较分散&#xff0c;需求简单还好&#xff0c;清晰明了&#xff1b;但是需求复杂之后&#xff0c;就会多出 watch&#xff0c;computed&#xff0c;i…