LC-1824. 最少侧跳次(动态规划)

news2024/11/17 10:49:52

1824. 最少侧跳次数

难度中等49

给你一个长度为 n3 跑道道路 ,它总共包含 n + 1 ,编号为 0n 。一只青蛙从 0 号点第二条跑道 出发 ,它想要跳到点 n 处。然而道路上可能有一些障碍。

给你一个长度为 n + 1 的数组 obstacles ,其中 obstacles[i]取值范围从 0 到 3)表示在点 i 处的 obstacles[i] 跑道上有一个障碍。如果 obstacles[i] == 0 ,那么点 i 处没有障碍。任何一个点的三条跑道中 最多有一个 障碍。

  • 比方说,如果 obstacles[2] == 1 ,那么说明在点 2 处跑道 1 有障碍。

这只青蛙从点 i 跳到点 i + 1 且跑道不变的前提是点 i + 1 的同一跑道上没有障碍。为了躲避障碍,这只青蛙也可以在 同一个 点处 侧跳另外一条 跑道(这两条跑道可以不相邻),但前提是跳过去的跑道该点处没有障碍。

  • 比方说,这只青蛙可以从点 3 处的跑道 3 跳到点 3 处的跑道 1 。

这只青蛙从点 0 处跑道 2 出发,并想到达点 n 处的 任一跑道 ,请你返回 最少侧跳次数

注意:点 0 处和点 n 处的任一跑道都不会有障碍。

示例 1:

img

输入:obstacles = [0,1,2,3,0]
输出:2 
解释:最优方案如上图箭头所示。总共有 2 次侧跳(红色箭头)。
注意,这只青蛙只有当侧跳时才可以跳过障碍(如上图点 2 处所示)。

示例 2:

img

输入:obstacles = [0,1,1,3,3,0]
输出:0
解释:跑道 2 没有任何障碍,所以不需要任何侧跳。

示例 3:

img

输入:obstacles = [0,2,1,0,3,0]
输出:2
解释:最优方案如上图所示。总共有 2 次侧跳。

提示:

  • obstacles.length == n + 1
  • 1 <= n <= 5 * 105
  • 0 <= obstacles[i] <= 3
  • obstacles[0] == obstacles[n] == 0

动态规划

class Solution {
    public int minSideJumps(int[] obstacles) {
        int n = obstacles.length;
        // 定义状态:dp[i][j]:到达第i个结点且在第j条道路所需要的最少侧跳数量
        int[][] dp = new int[n+1][4];
        // 初始化
        for(int i = 1; i <= n; i++){
            Arrays.fill(dp[i], 1000000);
        }
        dp[1][2] = 0;
        dp[1][3] = 1;
        dp[1][1] = 1;
        for(int i = 2; i <= n; i++){
            // 当前结点上的跑道上没有石头, 则直接可以由同一个跑道跳过来
            if(obstacles[i-1] != 1){
                dp[i][1] = dp[i-1][1];
            }
            if(obstacles[i-1] != 2){
                dp[i][2] = dp[i-1][2];
            }
            if(obstacles[i-1] != 3){
                dp[i][3] = dp[i-1][3];
            }
            // 除了可以从同一跑道的前一个结点跳过来, 还可以从其他另外两个跑道侧跳过来
            if(obstacles[i-1] != 1){
                dp[i][1] = Math.min(dp[i][1], Math.min(dp[i][2],dp[i][3])+1);
            }
            if(obstacles[i-1] != 2){
                dp[i][2] = Math.min(dp[i][2], Math.min(dp[i][1],dp[i][3])+1);
            }
            if(obstacles[i-1] != 3){
                dp[i][3] = Math.min(dp[i][3], Math.min(dp[i][1],dp[i][2])+1);
            }
        }
        return Math.min(dp[n][1], Math.min(dp[n][2], dp[n][3]));
    }
}

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

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

相关文章

【FPGA】Verilog 实践:狄摩根定律 | 布尔方程 | 1bit 比较器

写在前面&#xff1a;为了解狄摩根定理和布尔函数的行为&#xff0c;我们使用 Verilog 实现狄摩根定律和布尔函数的行为。生成输入信号后&#xff0c;验证通过仿真实现的结果。 Ⅰ. 前置知识 0x00 离散结构&#xff1a;否定量词的狄摩根定律 否定量词的狄摩根定律是&#xf…

基于自适应降噪的深度神经网络对抗图像检测【论文阅读】

近年来&#xff0c;许多研究表明&#xff0c;深度神经网络(DNN)分类器可能会被对抗性示例所欺骗&#xff0c;这种对抗性示例是通过对原始样本引入一些扰动来设计的。据此&#xff0c;提出了一些强大的防御技术。然而&#xff0c;现有的防御技术往往需要修改目标模型或依赖于攻击…

针对容器场景的多功能渗透工具

介绍 CDK是一款为容器环境定制的渗透测试工具&#xff0c;在已攻陷的容器内部提供零依赖的常用命令及PoC/EXP。集成Docker/K8s场景特有的 逃逸、横向移动、持久化利用方式&#xff0c;插件化管理。 下载/植入 将可执行文件投递到已攻入的容器内部开始使用 https://github.c…

浏览器打不开某些网站是什么原因导致,试试用这些方法来解决

不少小伙伴使用一些浏览器浏览网页的时候&#xff0c;发现打不开某些网站&#xff0c;这是什么原因导致的呢?本文讲汇总几个常见的原因&#xff0c;我们可以通过以下几个原因排查&#xff0c;并且使用下文的解决方法可以试试能否打开网站。打不开网站的原因1、浏览器限制如果用…

SpringMVC工作流程

SpringMVC工作流程 1. SpingMVC的常用组件 1&#xff09;DispatcherServlet 是一种前端控制器&#xff0c;由框架提供。作用&#xff1a;统一处理请求和响应。除此之外还是整个流程控制的中心&#xff0c;由 DispatcherServlet 来调用其他组件&#xff0c;处理用户的请求 2&am…

在甲骨文云容器实例(Container Instances)上部署Oracle Linux 8 Desktop

甲骨文云推出了容器实例&#xff0c;这是一项无服务器计算服务&#xff0c;可以即时运行容器&#xff0c;而无需管理任何服务器。 今天我们尝试一下通过容器实例部署Oracle Linux 8 Desktop。 创建容器实例 在甲骨文容器实例页面&#xff0c;单击"创建容器实例"&am…

【甄选靶场】Vulnhub百个项目渗透——项目五十六:sp-jerome(squid代理,计划任务)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目五十六&#xff1a;sp-jerome&#xff08;文件上传&#xff0c;缓冲区溢出&#xff09; &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4…

微信公众号主体已注销 如何办理账号迁移和公证书?

公众号主体公司已经注销&#xff0c;公众号也可以办理迁移的。而且需要尽快迁移&#xff0c;如果被微信系统检测到主体注销&#xff0c;而公众号还在经营就会要求限期迁移&#xff0c;否则公众号将被冻结。 下面我们就来说一下&#xff0c;主体已注销如何办理公众号迁移。 注&a…

Ubuntu20.04+GLFW搭建OpenGL开发环境

环境 系统&#xff1a;Ubuntu 20.04 桌面环境&#xff1a;X11 OpenGL版本: 3.0 桌面环境怎么看呢&#xff1f;可以在终端输入echo $XDG_SESSION_TYPE 即可&#xff0c;或者查看桌面右上角的Settings->About&#xff0c;查看Windowing System 查看OpenGL版本 使用glxinfo命…

【数据结构】深度剖析栈的各接口功能实现

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一.栈的概述&#x1f95d;&#xff1a; 1.栈的概念&#xff1a; 2.栈的结构&#xff1a; &#x1f349; 二、栈的各接口功能实现&#x1f349;&#xff1a; 1.栈的初始化&#xff1a; 2.压栈&#xff1a;…

十六进制转八进制(蓝桥杯基础练习C/C++)

我首先想到的就是十六进制转十进制&#xff0c;十进制转八进制&#xff0c;毕竟这样的方法是最常见的&#xff0c;但始终出现报错。 我想可能是int能储存的数范围太小了&#xff0c;就尝试用long long存储&#xff0c;结果还是报错。 #include <bits/stdc.h> using nam…

C++语法复习笔记-1. c++指针

文章目录1. 计算机内存1. 储存层次2. 内存单元与地址3. 指针定义2. 左值与右值1. 数组与指针1. 概念3. C中的原始指针1. 数组指针与指针数组2. const pointer 与 pointer to const3. 指向指针的指针4.关于野指针4.1 指向指针的指针4.2 NULL指针4.3 野指针5. 指针的基本运算5.1 …

Linux基础 IO

目录 一、文件操作 1.1 C语言文件操作 1.2 文件 系统调用接口 1.2.1 open/close函数 1.2.2 write/read函数 二、进程与文件 2.1 0&1&2 文件描述符 2.2 C语言FILE 2.3 (OS管理&进程找到) 被打开文件方法 2.3.1 struct file 描述文件属性(OS管理文件) 2.3…

线性时变系统的PID控制-2

在线性时变系统的PID控制-1的基础上采用S函数进行Simulink仿真。被控对象的描述方式可变换为&#xff1a;在S函数中&#xff0c;采用初始化、微分函数和输出函数&#xff0c;即mdllnitializeSizes函数、mdIDerivatives函数和mdlOutputs函数。在初始化中采用sizes结构&#xff0…

力扣sql简单篇练习(三)

力扣sql简单篇练习(三) 1 查找重复的电子邮箱 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT Email FROM Person GROUP BY Email HAVING count(id)>21.3 运行截图 2 每个产品在不同商店的价格 2.1 题目内容 2.1.1 基本题目信息 2.1.2 示…

[经典的图像warping方法] Thin Plate Spline: TPS理论和代码详解

0. 前言 2022年没有新写什么博客, 主要精力都在搞论文. 今年开始恢复! 本文的目标是详细分析一个经典的基于landmark(文章后面有时也称之为控制点control point)的图像warping(扭曲/变形)算法: Thin Plate Spine (TPS). TPS被广泛的应用于各类的任务中, 尤其是生物形态中应用…

动态内存管理(C语言)

目录 为什么要存在动态内存分配 动态内存函数的介绍 malloc函数 free函数 calloc函数 realloc函数 常见的动态内存错误 对NULL指针解引用错误 对动态开辟的空间越界访问 对非动态开辟内存使用free释放 使用free释放一块动态开辟内存的一部分 对同一块动态内存多次释放 动态开辟…

客快物流大数据项目(一百零五):启动ElasticSearch

文章目录 启动ElasticSearch 一、启动ES服务端 二、​​​​​​​启动Kibana 启动ElasticSearch

【NI Multisim 14.0虚拟仪器设计——放置虚拟仪器仪表(频率计数器)】

目录 序言 &#x1f3ee;放置虚拟仪器仪表&#x1f3ee; &#x1f9e7;频率计数器&#x1f9e7; &#x1f973;&#x1f973;&#xff08;1&#xff09;“测量”选项组:参数测量区。 &#x1f973;&#x1f973;&#xff08;2&#xff09;“耦合”选项组:用于选择电流耦合方…

CSDN 的故障处理流程,实例分享

CSDN 的研发团队每隔一段时间会和大家分享团队的进展&#xff0c;请看&#xff1a; 2021 年年底的汇报 2022 年上半年的汇报 2022 年下半年的汇报 从上面的报告中大家可以看到&#xff0c;我们在取得进展的同时&#xff0c; 也碰到了很多问题&#xff0c;也有一些困惑。 我写了…