左神算法题系列:动态规划机器人走路
机器人走路
假设有排成一行的N个位置记为1~N,N一定大于或等于2
开始时机器人在其中的start位置上(start一定是1~N中的一个)
如果机器人来到1位置,那么下一步只能往右来到2位置;
如果机器人来到N位置,那么下一步只能往左来到N-1位置;
如果机器人来到中间位置,那么下一步可以往左走或者往右走;
规定机器人必须走K步,最终能来到aim位置(P也是1~N中的一个)的方法有多少种
给定四个参数 N,start,aim,K 返回能走到的方法数
递归思路
1、当cur在1位置时,只能向2位置移动
2、当cur在N位置时,只能向N-1位置移动
3、当cur在中间位置,可以向cur+1位置移动、也可以向cur-1位置移动
4、如果剩余步数刚好走完时,来到目标位置,返回1,否则返回0
class RobotWalk(object):def ways_a(self, pos, steps, start, target):""":param pos: 总共有pos个位置:param steps: 可以走的步数:param start: 开始位置:param target: 目标位置:return:"""if pos < 2 or steps < 1 or start < 1 or start > pos or target < 1 or target > pos:return 0return self.process_a(pos, start, steps, target)def process_a(self, pos, cur, rest, target):""":param pos: 总共有pos个位置:param cur: 当前来到的位置:param rest: 还剩下的步数:param target: 目标位置:return: 机器人从cur出发,走过rest步之后,最终停留在target的方法数"""# 步数走完时,如果机器人刚好到达目标位置,则返回1if rest == 0:return 1 if cur == target else 0# 如果在1位置,只能向右走 -> cur+1if cur == 1:return self.process_a(pos, cur + 1, rest - 1, target)# 如果在最后一个位置,只能向左 -> cur-1if cur == pos:return self.process_a(pos, cur - 1, rest - 1, target)# 中间位置 既能向左又能向右return self.process_a(pos, cur + 1, rest - 1, target) + self.process_a(pos, cur - 1, rest - 1, target)
动态规划
加缓存
class RobotWalk(object):def ways_b(self, pos, steps, start, target):""":param pos: 总共有pos个位置:param steps: 可以走的步数:param start: 开始位置:param target: 目标位置:return:"""if pos < 2 or steps < 1 or start < 1 or start > pos or target < 1 or target > pos:return 0# 转移条件 剩下的步数 和 当前位置# 当前位置cur 范围 1~pos# 剩余步数rest 范围 0~steps# steps(总步数) 列 pos(总共位置数) 行的数组cache = [[-1] * (steps + 1) for _ in range(pos + 1)]return self.process_b(pos, start, steps, target, cache)def process_b(self, pos, cur, rest, target, cache):"""加缓存减少重复计算:param pos::param cur::param rest::param target::param cache::return:"""# 当前位置没有计算过,则计算后存入缓存,否则直接返回缓存数据if cache[cur][rest] == -1:# 步数走完时,如果机器人刚好到达目标位置,则返回1if rest == 0:index = 1 if cur == target else 0elif cur == 1:index = self.process_b(pos, 2, rest - 1, target, cache)elif cur == pos:index = self.process_b(pos, pos - 1, rest - 1, target, cache)else:index = self.process_b(pos, cur + 1, rest - 1, target, cache) + \self.process_b(pos, cur - 1, rest - 1, target, cache)cache[cur][rest] = indexreturn cache[cur][rest]
假如:
位置数 pos=6
剩余步数steps=5
开始位置start=1
目标位置target=4
cur为当前位置
创建动态表dp 行代表位置数 pos(1,pos), 列代表剩余步数rest(0,steps)
根据递归条件填表:
1、当剩余步数为0时,刚好来到target位置,dp值为1,如果在其他位置,说明未到目标位置,dp值为0
即:dp[cur][rest] = dp[4][0] = 1
2、当cur=1时,只能向2位置移动,都依赖dp[2][rest-1]位置的值
3、当cur=pos时,只能向pos-1位置移动,都依赖dp[pos-1][rest-1]位置的值
4、当1<cur<pos时,既能向cur-1位置移动,也能向cur+1位置移动,都依赖dp[cur-1][rest-1]+dp[cur+1][rest-1]
最终求dp[start][rest] --> dp[1][5] = 4
| cur/rest
| 位置/剩余步数 | 0 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|---|
| 0 | x | x | x | x | x | x |
| 1 | 0 | 0 | 0 | 1 | 0 | 4 |
| 2 | 0 | 0 | 1 | 0 | 4 | 0 |
| 3 | 0 | 1 | 0 | 3 | 0 | 10 |
| 4 | 1 | 0 | 2 | 0 | 6 | 0 |
| 5 | 0 | 1 | 0 | 3 | 0 | 9 |
| 6 | 0 | 0 | 1 | 0 | 3 | 0 |
代码实现
class RobotWalk(object):def ways_c(self, pos, steps, start, target):""":param pos: 总共有pos个位置:param steps: 可以走的步数:param start: 开始位置:param target: 目标位置:return:"""if pos < 2 or steps < 1 or start < 1 or start > pos or target < 1 or target > pos:return 0# 当前位置cur 范围 1~pos# 剩余步数rest 范围 0~steps# steps(总步数) 列 pos(总共位置数) 行的数组dp = [[0] * (steps + 1) for _ in range(pos + 1)]# 当剩余0步时,刚好来到target位置 则dp值为1, 其他位置值为0dp[target][0] = 1# 列for col in range(1, steps + 1):# 第一行依赖左下元素dp[1][col] = dp[2][col - 1]# 中间行依赖左下和左上for row in range(1, pos):dp[row][col] = dp[row + 1][col - 1] + dp[row - 1][col - 1]# 最末行依赖左上元素dp[pos][col] = dp[pos - 1][col - 1]return dp[start][steps]
相关文章:
左神算法题系列:动态规划机器人走路
机器人走路 假设有排成一行的N个位置记为1~N,N一定大于或等于2 开始时机器人在其中的start位置上(start一定是1~N中的一个) 如果机器人来到1位置,那么下一步只能往右来到2位置; 如果机器人来到N位置,那么下一步只能往左来到N-1位…...
LeetCode75——Day19
文章目录 一、题目二、题解 一、题目 724. Find Pivot Index Given an array of integers nums, calculate the pivot index of this array. The pivot index is the index where the sum of all the numbers strictly to the left of the index is equal to the sum of all…...
ToLua使用原生C#List和Dictionary
ToLua是使用原生C#List 介绍Lua中使用原生ListC#调用luaLua中操作打印测试如下 Lua中使用原生DictionaryC#调用luaLua中操作打印测试如下 介绍 当你用ToLua时C#和Lua之间肯定是会互相调用的,那么lua里面使用List和Dictionary肯定是必然的,在C#中可以调用…...
WebDAV之π-Disk派盘 + 言叶
言叶是一个功能丰富的笔记软件,为跨平台而设计,可以为你在手机、电脑和其他设备中实现多端同步。从而实现高效率的记事和办公。支持Markdown的语言和多种计算机语法高亮功能,让你笔记中的内容更加主次分明,可以在这里记录一些代码什么的。同时还可以在笔记中插入图片,使其…...
Spring Security: 整体架构
Filter Spring Security 是基于 Sevlet Filter 实现的。下面是一次 Http 请求从 client 出发,与 Servlet 交互的图: 当客户端发送一个请求到应用,容器会创建一个 FilterChain,FilterChain 中包含多个 Filter 和 Servlet。这些 Fi…...
JavaScript进阶知识汇总~
JavaScript 进阶 给大家推荐一个实用面试题库 1、前端面试题库 (面试必备) 推荐:★★★★★ 地址:web前端面试题库 1.原型链入门 1) 构造函数 当我们自定义一个函数时(箭头函数与生成器函数除外),这个函…...
理解C#中对象的浅拷贝和深拷贝
本文章主要介绍C#中对象的拷贝,其中包括浅拷贝和深拷贝,以及浅拷贝和深拷贝的实现方式,不同的实现方式之间的性能对比。 1、浅拷贝和深拷贝 浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它…...
js 生成随机数(含随机颜色)
生成 0-1 之间的随机数 Math.random()生成 0-x 之间的随机整数: Math.round(Math.random()*x)生成 min-max 之间的随机整数: Math.round(Math.random()*(max-min)min)生成N位随机数 /*** 函数--生成N位随机数* param {*} N 数字的长度*/ function random…...
【axios】axios的基本使用
一、 Axios简介 1、 Axios是什么? Axios是一个基于promise的HTTP库,类似于jQuery的ajax,用于http请求。可以应用于浏览器端和node.js,既可以用于客户端,也可以用于node.js编写的服务端。 2.、Axios特性 支持Promis…...
React 在非组件环境切换路由
我的react-router-dom版本是6.16.0。之前在react中是这样配置路由的 App.jsx import ReactDOM from react-dom/client; import { HashRouter, Route, Routes } from react-router-dom;const root ReactDOM.createRoot(document.getElementById("app")); root.rend…...
Oracle高速批量速插入数据解决方案
最近做短信群发项目有一个需求,需要客户大批量(十万级)导入数据. 开始是用insert单条数据,10万条数据要20分钟 后来发现可以用insert all 一条sql一次导入500条记录,这样10万条数据只用了1.5分钟,导入速度提高了近来20倍 下面就使用insert all的心得体会记录如下. 使用方法: i…...
基于单片机嵌入式的智能交通信号灯管理系统的设计与实现
项目介绍 有目共睹电子设备已经席卷了整个人类生活,他们不断改善着人们的起居住行,这也就促进了嵌入式人工智能的快速发展。 本课设模拟系统分为软硬件两部分组成。硬件部分是由两位8段数码管和LED灯构成的显示系统和控制电路等组成,能较好的…...
在全新ubuntu上用gpu训练paddleocr模型遇到的坑与解决办法
目录 一. 我的ubuntu版本二.首先拉取paddleocr源代码三.下载模型四.训练前的准备1.在源代码文件夹里创造一个自己放东西的文件2.准备数据2.1数据标注2.2数据划分 3.改写yml配置文件4.…...
React之服务端渲染
一、是什么 在SSR中 (opens new window),我们了解到Server-Side Rendering ,简称SSR,意为服务端渲染 指由服务侧完成页面的 HTML 结构拼接的页面处理技术,发送到浏览器,然后为其绑定状态与事件,成为完全可…...
jetson nano刷机更新Jetpack
只是记录个人在使用英伟达jetson Nano的经历,由于头一次尝试,所以特此记录需要的问题和经验。 一,英伟达刷机教程(jetson nano 版本) 本次我是直接刷机到TF卡,然后TF卡作为启动盘进行启动,我看网上有带EMMC版本的,好像可以直接把系统镜像安装到EMMC里面。但是有个问题…...
Android官方ShapeableImageView描边/圆形/圆角图,xml布局实现
Android官方ShapeableImageView描边/圆形/圆角图,xml布局实现 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.…...
ubuntu扩大运行内存, 防止编译卡死
首先查看交换分区大小 grep SwapTotal /proc/meminfo 1、关闭交换空间 sudo swapoff -a 2、扩充交换空间大小,count64就是64G 1G x 64 sudo dd if/dev/zero of/swapfile bs1G count64 3、设置权限 sudo chmod 600 /swapfile 4、指定交换空间对应的设备文件 …...
Kafka集群修改单个Topic数据保存周期
在大数据部门经常使用Kafka集群,有的时候大数据部门可能在Kafka中的Topic数据保存时间不需要很长,一旦被消费后就不需要一直保留。默认Topic存储时间为7day,个别的Topic或者某台Kafka集群需要修改Topic数据保存的一个周期,调整为3…...
selenium模拟登录无反应
在使用自动化工具selenium时对某些网站登录界面send_keys输入账号密码,运行时却没有自己想要的结果出现,这是因为你碰到前端二般的开发人员,他们用的是HTML嵌套,这对后端人员造成了一些麻烦,废话不多说,直接…...
指针变量未分配空间或者初始化为空指针使用问题
提示:关于指针 文章目录 前言一、指针的使用总结 前言 在看c书籍的时候,看到浅复制和深复制时,说到成员为指针的时候,会出异常。但是其实没有更多的感想,但是联想到上次考试指针没分配空间导致程序异常的情况…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
