精灵鼠从入口到出口最少减少速度(2019年哔哩哔哩校招真题)题解

题目以及输入输出描述:

题目很短。意思也很容易读懂。

题目要求就是  有一只老鼠,进入了一个迷宫,迷宫地图的大小为n*n。老鼠要从(起点)(0,0)坐标位置 到达 终点 (n-1,n-1)的位置。

老鼠的行动方式只有两种 —— 向下和向前。

每一个点都会让老鼠的速度降低(减少)。求老鼠到达终点的时候最少减少的速度。

解题思路:

我们先考虑最后一步 到达终点,这一步可以从哪里来呢?根据题目分析因为老鼠只可以向下或者向前。所以到达终点(n-1,n-1)前,老鼠不是在(n-1,n-2),

就是在(n-2,n-1); 这样我们可以得出,到达每一个点之前老鼠的位置只有两种可能——该点的上方或者该点的后方(左方)。其实这样子的思想就是动态规划的思想。

把问题从一个阶段分成多个单阶段。每到达一个点就是一个单阶段。根据每一个单阶段的的关系求解。每个单阶段(每到达一个点)的上一阶段(上一个点)只可能是该点上方

或者左方。这就是关系。 而题目求的是最少的减少速度。 正好我们的 每一阶段对应的上一阶段有两种。那么我们求解的时候就可以做选择。把该点的最少减少速度表示为:

当前点的减少速度 + 最小值(上一阶段(点)左方,上一阶段(点)上方减少速度); 则就是利用了关系求解 也可以说是一条递推的式子。我们从(0,0)递推到尾(n-1,n-1);

最终的便是答案。

解题代码:

 1 import java.util.Scanner;
 2
 3 public class Main{
 4
 5     public static void main(String[] args) {
 6         Scanner in = new Scanner(System.in);
 7         int n;
 8         n = in.nextInt();
 9         int[][] dp = new int[n][n];
10         char[][] loseSpeed = new char[n][n];
11         for (int i = 0; i < n; i++) {
12             String str = in.next();
13             int index = 0;
14             for (int j = 0; j < n; j++) {
15                 loseSpeed[i][j] = str.charAt(index);
16                 index += 2;
17             }
18         }
19         dp[0][0] = loseSpeed[0][0] - 48;
20         for(int i=1;i<n;i++){
21             dp[i][0]=dp[i - 1][0] + (loseSpeed[i][0] - 48);
22             dp[0][i]=dp[0][i - 1] + (loseSpeed[0][i] - 48);
23         }
24         for (int i = 1; i < n; i++)
25             for (int j = 1; j < n; j++) {
26                     dp[i][j] = Math.min(dp[i][j - 1], dp[i - 1][j]) + (loseSpeed[i][j] - 48);
27             }
28         System.out.println(dp[n - 1][n - 1]);
29     }
30 }

这题的输入格式有点刁钻。中间会夹杂着 逗号。所以输入的处理有点讲究(个人觉得- -)。这里我采用的是用 loseSpeed这个char类型的二维数组来表示地图。lose[i][j]表示的就是(i,j)点减少的速度。

而dp这个int类型的二维数组数组 则就是递推求解过程中存储答案的。dp[i][j]表示(到达i,j)点最少的减少速度。

递推前先把边界处理好。(0,0)点是起点 所以 dp[0][0]就是loseSpeed[0][0] 的int 值。

而对与地图的最上方(第一行) 老鼠只可以从左方到达该点无法从上方下来。所以 对于第一行dp[0][j] 就是 dp[0][j] +dp[0][j-1];

同理 地图最左方(第一列),只可以从上方下来无法从左方向前到达,所以对于第一列dp[i][0] 就是dp[i-1][0] + dp[i][0];

而其余的点就是正常的递推就好。

吐槽一下:搞不懂这时间的咋回事- -。之前AC的时候是只需要300多ms的,而现在

要400多ms了- -,搞不懂为啥不稳定啦- -。300多ms 的时候还是Java提交里第一的- -

好了好了讲解结束,本人只是个渣渣普通二本还在读大二呢。这还是才第二篇博客- -如果有什么写错了,麻烦各位大佬高抬贵手不喜勿喷~.

原文地址:https://www.cnblogs.com/vibe/p/11725604.html

时间: 2024-07-30 11:35:36

精灵鼠从入口到出口最少减少速度(2019年哔哩哔哩校招真题)题解的相关文章

二级MS Office高级应用考试真题精讲冲刺专用

课程目标:本课程主要用于全国计算机二级 MS Office高级应用的考前冲刺,根据我们的线下测试,本视频配合考试软件考前练习至少两遍过关率在92.8%(2015年9月份考试数据) 适合人群:主要适用于考取全国计算机二级MS Office高级应用证书的学员. 课程介绍: 本课程总共收录历年来计算机二级MS Office高级应用考试真题,对每套题进行精细讲解,遇到疑难操作会有提示同时在讲解过程中也会提示学员考试容易范的错误.主要用于考前冲刺. 本系列课程主要是有刘王斌讲师讲解,课程主要是运用于全国计

Webpack 4 学习03(配置入口和出口的进阶使用)

一.单出口形式 webpack.config.js const path = require('path'); module.exports = { //单出口形式 entry:['./public/index.js','./public/index2.js'],//有多个文件 output:{ path:path.resolve(__dirname,'build'), filename:'bundle.js' } } 运行npm run dev 生成唯一的打包文件 bundle.js 二.多出

qml 绘制高精地图之怀疑人生的加载速度

绘制高精地图时需要gps的经纬度坐标,之前的实现方式是QGeocoordinate类的经纬度变量通过json的方式在qml中使用. 以画线为例,使用方式是这样哒. 1 for(var i in vehicleMapProcess.laneMedian){ // 道路条数 2 var newMapLaneMedian = Qt.createQmlObject('import QtLocation 5.9;import QtPositioning 5.5; // 这里只画中线 3 MapPolyli

2016年下半年软考网络工程师真题解析精编版

建议考前多熟记的知识点(1)《网络工程师软考辅导——3年真题精解与闯关密卷》

面试官系统精讲Java源码及大厂真题系列之Java线程安全的解决办法

1. 背景 1.1 static修饰类变量.方法.方法块.  public + static = 该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.static 变量 1.2 多个线程同时对共享变量进行读写时,很有可能会出现并发问题.(存在共享数据时才需要考虑线程安全) 1.3 public static List<String> list = new ArrayList(); 这个 list 如果同时被多个线程访问的话,就有线程安全的问题. 2. 解决方法 2.1特定策略解决线程

Web自动化测试 Selenium基础到企业应用

如需下述哪一个课程,加QQ: 3475362830,非免费,几大洋,非诚勿扰! java (Java仿微信全栈 高性能后台+移动客户端 )NettySpringboot仿微信聊天全栈实战 从0开发到上线部署(完整版) HBase+SpringBoot实战分布式文件存储 Java并发编程与高并发解决方案(完整无密) IT段子手详解MyBatis遇到Spring 秒学Java SSM开发大众点评 难度中级 Activiti6(1).0工作流引擎深度解析与实战 HBase+SpringBoot实战分布

计算机专业如何高质量的走完大学四年?毕业成为Offer收割机

前言:迷茫本就是青春该有的模样,但不要让未来的你讨厌现在的自己. "就要毕业了. 回头看自己所谓的大学生活, 我想哭,不是因为离别,而是因为什么都没学到. 我不知,简历该怎么写,若是以往我会让它空白. 最大的收获也许是--对什么都没有的忍耐和适应--" 这是一个大四同学给李开复的信,这封来信道出了不少大三.大四学生的心声.大学期间,有许多学生放任自己.虚度光阴,还有许多学生始终也找不到正确的学习方向.当他们被第一次补考通知唤醒时,当他们收到第一封来自应聘企业的婉拒信时,这些学生才惊讶地

你是怎么变自律的?

很多小伙伴咨询我, "看别人坚持健身拥有好身材,我坚持不了咋办?" "我朋友天天早起看书,我都睡到自然醒,是不是要废了?" "我要向前辈看齐,每天7点起床,11点睡,每天坚持自学三小时" 钟表式的生活方式就是自律?别人的时间表,真的就适合你?你真的需要这样吗? 先写结论吧:自律是假相,你要能找到自己的驱动器,而不是自律本身,有些自律,其实是没有任何意义的.记得点赞呀. 目录: 自律的假相 找到自己的驱动器,你也行 小以拆大,形成习惯 一些建议 一