试题 算法提高 网格贪吃蛇(离散化 + DP)

news2024/11/23 12:13:54

资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
  那个曾经风靡全球的贪吃蛇游戏又回来啦!这次贪吃蛇在m行n列的网格上沿格线爬行,从左下角坐标为(0,0)的格点出发,在每个格点处只能向上或者向右爬行,爬到右上角坐标为(m-1,n-1)的格点时结束游戏。网格上指定的格点处有贪吃蛇喜欢吃的豆豆,给定网格信息,请你计算贪吃蛇最多可以吃多少个豆豆。
输入格式
  输入数据的第一行为两个整数m、n(用空格隔开),分别代表网格的行数和列数;第二行为一个整数k,代表网格上豆豆的个数;第三行至第k+2行是k个豆豆的横纵坐标x、y(用空格隔开)。
输出格式
  程序输出一行,为贪吃蛇可吃豆豆的最大数量。
样例输入
10 10
10
3 0
1 5
4 0
2 5
3 4
6 5
8 6
2 6
6 7
3 1
样例输出
5
数据规模和约定

  1 ≤ m, n ≤ 106,0 ≤ x ≤ m-1,0 ≤ y ≤ n-1,1 ≤ k ≤ 1000
题目链接:网格贪吃蛇

分析:

  看完题,相信小伙伴很容易就会想到状态转移方程:因为 d p [ i ] [ j ] dp[i][j] dp[i][j]一定是 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j]或者 d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1]转移过来的,但是一看数据规模,若开106 的二维 int 型数组(4 X 106 X 106 / 1024 / 1024 = 3814697MB),内存超限。
  再看 k 最大不超过 1000,将这 1000 个点离散化即可,开 103 的二维数组是不会内存超限的。
(PS:这是我第一次做离散化的题,看了相关知识点的视频,结合例子去理解到的,离散化的概念我就不赘述了,小伙伴可以先去搜索离散化的概念,再结合我的题解进行理解)。

思路:

  将所有点的横、纵坐标都存进同一个数组,然后从小到大排序,各个数字对应一个数组下标,将原来的点映射在新的以数组下标构成的坐标系,这就将其离散化了。下面结合例子以及图片进行理解。
假设有三个点(5,10),(41,16),(100,37),若以常规的100X100的坐标系,那么会有很多的空间浪费,
在这里插入图片描述

将其横纵坐标离散化,映射在新的坐标系:
在这里插入图片描述
那么原来的各个点在新坐标系的位置为:
  (5,10) -> (0,1), (41,16) -> (4,2), (100,37) -> (5,3)
这样就将 100X100 的空间减小到了 5X5,极大的节省了空间,这是解决本题的核心。
在这里插入图片描述

注意:在进行离散化时,需要对数字进行去重,避免出现以下的情况,不然映射新的坐标系会产生歧义,导致错误:
在这里插入图片描述

代码(细节写在了注释):

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main {
	static int m, n, k;
	static dot[] dots = new dot[1005];	//存放点的数组
	//长度为2000是因为横纵坐标都要映射为数组下标,共2000
	static int[][] g = new int[2010][2010];	//新的坐标系
	static int[][] dp = new int[2010][2010];
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		m = sc.nextInt(); n = sc.nextInt(); k = sc.nextInt();
		//存横纵坐标的数字的集合,采用HashSet自动去重
		Set<Integer> nums = new HashSet<>();
		for (int i = 1; i <= k; i++) {
			int x = sc.nextInt();
			int y = sc.nextInt();
			dots[i] = new dot(x, y);	//将点放入点数组
			nums.add(x);	//将x,y加入集合
			nums.add(y);
		}
		Integer[] arrNums = nums.toArray(new Integer[nums.size()]);	//set转为数组
		Arrays.sort(arrNums);	// 排序/离散化,每个数字对应一个数组下标
		for (int i = 1; i <= k; i++) {	//将原来各坐标映射到新坐标系
			int x = find(dots[i].x, arrNums);//找到映射的点(x,y)
			int y = find(dots[i].y, arrNums);
			//这里的x,y都是从0开始,我习惯从1开始,就加了1,也方便后面dp的运算
			g[x+1][y+1] = 1;	
		}
		int len = arrNums.length;
		for (int i = 1; i <= len; i++) {
			for (int j = 1; j <= len; j++) {
				dp[i][j] = g[i][j];
				dp[i][j] += Math.max(dp[i-1][j],dp[i][j-1]);
			}
		}
		System.out.println(dp[len][len]);
	}
	public static int find(int x, Integer[] arr) {//二分查找映射的下标
		int l = 0, r = arr.length - 1;
		while(l < r) {
			int mid = (l + r) >> 1;
			if(x == arr[mid])
				return mid;
			if(x < arr[mid])
				r = mid;
			else l = mid + 1;
		}
		return l;
	}
}
class dot{
	int x, y;
	public dot(int x, int y) {
		this.x = x;
		this.y = y;
	}
}

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

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

相关文章

miui14即将闪亮登场 小米首批机型搭配名单 旧版系列机型可能无望更新

小米系列机型年底大动作。新版机型发布和miui14系统将会在一些机型中更新&#xff0c;而最新的miui14版本以简便 精简 轻巧为目的。希望miui14版本能为米粉带来意想不到的期待。以往较多米粉都反馈系统越更新越臃肿。系统资源占用太多。 小米 MIUI 14 的版本号以及适配支持机型…

柯桥俄语培训机构哪家好,能说出“как”的多少种用法呢?

学了这么久俄语的你&#xff0c;能说出“как”的多少种用法呢&#xff1f; 一起来看看这份“как”最强使用攻略吧~ 01 作为疑问副词在句中做状语&#xff0c;"如何""怎么样""多么" 例&#xff1a; Как твои дела&#xff1f; …

H3C 防火墙混合实验

H3C 防火墙混合实验一、项目拓扑二、项目需求三、配置步骤1. 配置IP地址2. FW默认路由&#xff0c;FW指向internet3. 绑定防火墙安全域端口4. 配置防火墙安全策略5. OSPF6. NAT7. PC 默认路由&#xff0c;PC 指向 R1链接: 拓扑下载 一、项目拓扑 二、项目需求 根据题目要求配…

6种常见三维曲面的Three.js实现

这篇文章详细介绍了三次曲线、贝塞尔曲线和 B 样条曲线和曲面背后的数学原理&#xff0c;并提供了使用 Three.js 库实现的代码。 1、简介 你可以在这里访问上图应用程序。此应用程序名为 CurSur&#xff0c;是 Curves and Surfaces 的简称。原始代码可以在这里获取。 在几何设…

算法训练Day27 | LeetCode39. 组合总和 (元素可重复,数组长度不限);40. 组合总和III(去重);131.分割回文串

目录 LeetCode39. 组合总和 1. 思路 2. 代码实现 3. 剪枝优化 4. 复杂度分析 5. 思考与收获 LeetCode40. 组合总和III 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考与收获 LeetCode131.分割回文串 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考与收获 LeetCode39…

通过DewarpNet解决图片扭曲问题

一、论文 DewarpNet:使用堆叠的三维和二维回归网络进行单幅图像文件纠正 论文地址: https://paperswithcode.com/paper/dewarpnet-single-image-document-unwarping 代码地址: https://github.com/cvlab-stonybrook/DewarpNet 二、效果展示 2.1 论文图片效果展示 从上往下…

Android Material Design之SwitchMaterial(三)

老规矩先上图 引入 implementation com.google.android.material:material:1.4.0说明 该控件就是Switch控件的增强版本,属性基本一致 属性 属性描述android:text文本android:textOn滑块打开时显示的文本android:textOff滑块关闭时显示的文本android:thumb滑块图片app:trac…

这款比奥维地图还方便的地图软件!轻便好用,功能很强大

写方案或报告的人往往会遇到需要在地图上标注的问题。最简单的方法莫过于在百度上截图&#xff0c;然后在ppt里标注。现场勘察需要定位&#xff0c;最基本的方法是利用手机读取和记录经纬度坐标。但使用百度底图标注给客户的感觉太普通&#xff0c;而勘察现场记录的经纬度数据事…

深度分页、唯一索引的坑、分库分表、查询分离、连接池、bufferpool优化等

文章目录表过大深度分页count(*) 与 count(列名)唯一索引分库分表只分库不分表不分库只分表分库也分表查询分离使用方法查询分离的适用场景冷热分离适用场景实现方案数据库连接池优化主键无序buffer pool 太小MySQL频繁抖动的性能优化原因解决表过大 历史数据进行归档 深度分页…

需求开发到一半需要改别的分支的bug该怎么办呢?(git stash 和 git commit)

在实际开发中&#xff0c;经常我们会遇到需求开发到一半&#xff0c;别的分支有bug急需解决的情况&#xff0c;这个时候我们改怎么办呢&#xff1f; 有的人会说可以先提交当前分支的代码再切换到别的分支改bug&#xff0c;当然这样是没问题的&#xff0c;但是呢&#xff0c;在项…

【计算机毕业设计】1.房屋租赁系统

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘要 当今社会房屋租赁、出售买卖是必不可少的&#xff0c;人们不管走到哪里都需要有一个温馨的家&#xff0c;有一个落脚之地&#xff0c;所以房屋租赁、出售市场也是非常火爆&#xff01;不管是房屋租赁、出售、中…

基于conda的OpenCV库安装

基于conda的OpenCV库安装 OpenCV库的调用名是cv2 所以会看到这样的import语句 import cv2这句话就是对openCV库的调用 openCV库的下载安装 First 好像不需要像网上的教程那样, 首先去官网下载exe执行文件, 然后在VS中进行配置 直接在teminal中, 进入要指定的conda环境, …

编译原理实验--实验二 递归下降法判断算术表达式的正确性--Python实现

目录 一、实验目的和要求 二、实验内容 三、实验环境 四、实验步骤 1、语法分析所依据的文法&#xff1b; 2、给出消除左递归及提取左公因子的文法&#xff1b; 五、测试要求 六、实验步骤 1、语法分析所依据的文法 2、给出消除左递归及提取左公因子的文法&#xff1…

iNFTnews|国内数藏平台大撤退,寒冬之下海外市场是否有出路?

腾讯旗下继腾讯新闻、幻核之后&#xff0c;仅存的数藏平台也关停了。 11月16日&#xff0c;据界面新闻报道&#xff0c;腾讯TME旗下QQ音乐已经叫停“TME数字藏品”业务&#xff0c;原团队部分成员已内部活水。 一接近腾讯集团的知情人士称&#xff0c;腾讯方面曾对数字藏品业…

【Linux】生产者消费者模型

文章目录1.生产者消费者模型1.1生产者消费者模型的特点1.2生产者消费者模型的原则1.3生产者消费者模型的优点2.基于阻塞队列的生产者消费者模型2.1如何理解生产者消费者模型的并发&#xff1f;3.信号量3.1信号量接口3.2基于环形队列的生产者消费者模型3.3信号量和条件变量的区别…

Git_GitHub——基本操作、创建远程库、远程库操作、团队协作、SSH免密登录

网址:GitHub: Let’s build from here GitHub 目录 一、创建远程仓库 二、远程库操作 2.1 查看远程库别名 2.2 创建远程仓库别名 2.3 推送本地分支到远程仓库 2.4 拉取远程库到本地库 2.5 克隆远程库到本地 三、 跨团队协作 3.1 团队内协作 3.2 跨团队协作 四、SSH免密码登…

Go : golang发布三方包流程简介

文章目录一、创建项目仓库二、拉去仓库&#xff0c;编辑代码三、推送与发布代码四、使用发布的第三方包小结一、创建项目仓库 1.输入仓库的名字&#xff0c;我这里输入simpleExample&#xff0c;用来做演示 2.选择public&#xff0c;公开。要不并不好拉 3.选择需要添加的文件(…

用PyPy加速Python程序

用PyPy加速Python程序 在《Python性能优化指南–让你的Python代码快x3倍的秘诀》中有提到&#xff0c;我们可以用更好的Python运行环境或运行时优化来提升Python的速度&#xff0c;其中最成熟、使用最简单的当属PyPy。用PyPy&#xff0c;可以在不改变源代码的情况下&#xff…

二叉树相关OJ - C++

文章目录&#xff1a;根据二叉树创建字符串二叉树的层序遍历二叉树的最近公共祖先二叉搜索树与双向链表从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树二叉树的前序遍历&#xff08;非递归&#xff09;二叉树的中序遍历&#xff08;非递归&#xff09;二叉树的…

【LeetCode与《代码随想录》】数组篇:做题笔记与总结-Java版

代码随想录地址 是学习过程中的笔记&#xff01;图来自代码随想录。 文章目录理论题目704. 二分查找35. 搜索插入位置34. 在排序数组中查找元素的第一个和最后一个位置69. x 的平方根367.有效的完全平方数理论 数组是存放在连续内存空间上的相同类型数据的集合。 数组下标都是…