枚举算法及其优化

article/2025/8/23 14:47:08

引言:

总结一下这个简单的算法~

一、什么是枚举算法:

枚举算法很简单,就是将问题的所有可能列举出来,然后通过筛选,找出解,它的时间复杂度通常很大,在一些题目中可能会TLE,因此重要的是如何优化所写的枚举算法。

二、枚举算法优化的思路:

删除重复和不可能出现的情况。重复和不可能出现的情况都列出来,找到其中的规律。

三、经典例题:

我们上一道经典例题:

题目描述:有一个n×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。

输入格式:一行,两个正整数n,mn≤5000,m≤5000)。

输出格式:一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。

样例:输入——2 3 输出——8 10

我的最终代码:

第一次思路:

纯暴力枚举,确定一个矩形需要四个指针,四个指针可以确定长和宽长度,因此分别设为row(列底),pointr(列顶),col(行首),pointc(行尾),我用word文档以展示:

长就是pointc - col + 1,宽就是pointr - row + 1。

我们设a = pointr - row,b = pointc - col,注意,a和b并不是长和宽,而是长宽-1得到的,因此当长或宽为1时,代表的a和b是0.

只要判断他们相等是一个正方形。

在判断之前,我们通过找规律可以总结出一个n*m矩形的所有子矩形的公式:

oblong = ((1.0/2)*m*m+(1.0/2)*m)*((1.0/2)*n*n+(1.0/2)*n);

因此,只要将总子矩形个数减去正方形个数,就是除了正方形之外的长方形个数。

第一次暴力的代码,用了四个for,直接TLE了不少样例,只AC了3个。

第二次思路:

通过找规律,col值不变而pointc向右移动时,正方形只能出现一次,也就是一个col值只能有一个正方形,因此在第四个for,if判断找到正方形后,用break从col进入到col+1,代码只是多了一个break:

发现多AC了一个,但是还是有很多TLE了。

第三次思路:

通过找规律,我发现对于一个1*m的矩阵,1*1正方形有m个,那么在暴力枚举找这个1*1正方形时,就会重复枚举1*1正方形m次,能不能只需要枚举1次,就可以一次性找到m个1*1正方形?同理,对于,2*m矩阵,2*2正方形则有m-1个,能不能只需要枚举一次,就可以找到m-1个2*2正方形?

通过一一列举这些已经重复的情况,我们发现一个公式,列数m - 正方形长度 + 1 = 正方形个数。进一步化简,正方形个数x = m - a;

那么我们就可以通过列数的值,确定一个n*m长方形(n > m)的正方形个数,n*m长方形的n*n正方形个数x = m - a;a通过双指针pointr与row得到,因此可以将两个for省略,得到两个for的暴力枚举代码:

这时候就已经满足时间限制了,大大减少了时间复杂度,然而我还不是很满足,能不能做到一个for?

第四次思路:

仿照寻找重复性的优化思路,我发现在行的方向上也存在重复性,即一个7*6矩阵,分成7个1*6矩阵,那么这7个1*6矩阵的正方形个数是一样的,都是6个,同理,分成6个2*6矩阵,则2*2正方形个数也是一样的,是5个。那么,7*6就得到了7个1*6矩阵的总1*1正方形个数,6*5就得到了6个2*6矩阵的2*2正方形总个数,能不能通过一次枚举,枚举出一个1*6矩阵的1*1正方形个数,就可以得到7个1*6矩阵1*1正方形总个数?

我们发现只需要将1*6矩阵正方形个数乘以7就可以得到1*1正方形总个数,同理2*6矩阵。因此存在一个未知数times,times乘以1*6矩阵正方形个数就可以得到所有的1*1正方形个数,通过列出所有的重复情况,我们得到times = 行数n - a的结果。我们进行一个循环,让row一直在1位置,pointr从1到行数n,pointr和row的每个组合就是:1*6,2*6,3*6,4*6,5*6,6*6,7*6矩阵,可以分别找出所有的1*1,2*2,3*3,4*4,5*5,6*6正方形,于是就有了最上面第一个代码段的结果,只需要一个for就能找出所有的正方形。

看到这里你也很不容易,祝你学习快乐~喜欢的话欢迎点赞关注哦~


http://chatgpt.dhexx.cn/article/BrEb9ayR.shtml

相关文章

算法之枚举

枚举 一、理解枚举类型 枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看…

【算法】枚举算法

目录 算法详述 例题 A - 火柴棒等式 B - 砝码称重 输入格式 输出格式 算法详述 枚举:即对可能的解集合一一列举。 枚举算法的实现往往通过使用循环(嵌套)就能够轻易实现,所以并没有什么思维难度。 解题思路: …

基础算法(一):枚举算法

前言 从这篇文章开始,小荔枝就开始学习算法和数据结构啦!!!我们先来看看入门的一些基础算法,在这篇文章中,主要介绍的是枚举算法。我们重点需要了解枚举算法使用时需要确定的条件,荔枝会用一道题…

常用算法——枚举算法

在进行归纳推理时,如果逐个考察了某类事件的所有可能情况,因而得出一般结论,那么这结论是可靠的,这种归纳方法叫做枚举算法 一、基本概念和算法 枚举算法简称枚举法,也称为列举法、穷举法,是暴力策略的具体…

枚举算法

一、枚举法的基本思想 枚举法又称穷举法。 基本思想是根据提出的问题枚举所有可能状态,并用问题给定的约束条件检验哪些状态是需要的,哪些状态是不需要的。 能使命题成立的状态,即为其解。 枚举结构:循环判断语句。 二、枚举…

传统人工势场法---经典算法

网上代码很多,这个可以直接使用。 Xo[0 0];%起点位置 k50;%计算引力需要的增益系数 K0;%初始化 m15;%计算斥力的增益系数,都是自己设定的。 Po0.5;%障碍影响距离,当障碍和车的距离大于这个距离时,斥力为0,即不受该障碍…

人工势场法(APF) —— Path Planning

版权声明:本文为博主原创博文,未经允许不得转载,若要转载,请说明出处并给出博文链接 维基百科说:“人工势场法(Artificial Potential Field, APF)是一种将机器人的外形视为势场中的一…

基于人工势场法的移动机器人路径规划研究(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 路径规划是移动机器人领域的热点研究方向,人工势场法已在工业机器人路径规划中得到广泛应用,近年来正逐…

11(0)-AirSim+四旋翼仿真-人工势场法避障

1.基本原理 人工势场法的基本原理为,根据地图内障碍物、目标点等的分布,构造一个人工势场,无人机由势能较高的位置向势能较低的位置移动。就好比是一个电场,电场内不同位置的电势能不同,对带电物体产生的力也不同&…

局部路径规划中的人工势场法

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。 一、简介 如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。 这个图比较清晰的说明了人工势场法的作用&#…

matlab箭头梯度方向场,局部路径规划算法——人工势场法

人工势场法是由Khatib于1986年提出,其方法是将移动机器人所处的环境用势场来定义,通过位置信息来控制机器人的避障行驶,基本思想是构造目标位姿引力场和障碍物周围斥力场共同作用的人工势场,搜索势函数的下降方向来寻找无碰撞路径。人工势场法避障技术使得机器人的移动能很…

基于人工势场法的车辆编队轨迹规划matlab仿真验证

给出了完整的MATLAB代码仿真;基于人工势场法编队的基本原理:通过构建车辆相对目标点的引力势场和斥力势场构建车辆所处地图下的整体势场,设置如图所示的势场图, 图中圆心为我们参考的目标点,其可以提供引力方向&#x…

基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题

目录 1.算法描述 2.matlab算法仿真效果 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 人工势场法原理是:首先构建一个人工虚拟势场,该势场由两部分组成,一部分是目标点对移动机器人产生的引力场,方向由机器人指向目标点&#xf…

matlab人工势场法三维演示图,运动规划入门 | 5. 白话人工势场法,从原理到Matlab实现...

如何利用人工势场进行运动规划? 1.1 引力势场(Attractive Potential Field) 人工势场这个特殊的势场并不是一个单一的场,其实它是由两个场叠加组合而成的,一个是引力场,一个是斥力场。 顾名思义引力势场是具有吸引的性质,会将机器人从起点处朝着终点处吸引,所以引力场的存…

路径规划算法3 改进的人工势场法(Matlab)

目录 传统人工势场 引力势场 斥力势场 合力势场 传统人工势场法存在的问题 改进的人工势场函数 Matlab代码实现 参考链接: [1]朱伟达. 基于改进型人工势场法的车辆避障路径规划研究[D]. 江苏大学, 2017. 1986年Khatib首先提出人工势场法,并将其应用在…

【控制】人工势场法及人工势场函数

目录 人工势场法-维基百科路径规划-人工势场法(Artifical Potential Field)引力场 (attractive/gravitation field)斥力场 (repulsive field)总场 【机器人路径规划】人工势场法PaperMatlab 代码自己编写的 Matlab1. 仅考虑引力的情况 人工势场法-维基百…

移动机器人路径规划:人工势场法

人工势场法是一种原理比较简单的移动机器人路径规划算法,它将目标点位置视做势能最低点,将地图中的障碍物视为势能高点,计算整个已知地图的势场图,然后理想情况下,机器人就像一个滚落的小球,自动避开各个障…

人工势场法matlab讲解_【机器人路径规划】人工势场法

阅读本文需要的基础知识为: 理解机器人的构型空间。建议阅读:机器人运动规划中的C space怎样理解?为什么不直接在笛卡尔坐标系下运算呢? 本文的实现程序与使用说明见我的学习工具箱:小明工坊:【个人开源】机器人运动规划学习工具箱使用说明 基本原理 1.概述 我们打两个比…

学习笔记:人工势场法

一、算法简介 1986年Khatib首先提出人工势场法,并将其应用在机器人避障领域,而现代汽车可以看作是一个高速行驶的机器人,所以该方法也可应用于汽车的避障路径规划领域。 二、算法思想 1、人工势场法的基本思想是在障碍物周围构建障碍物斥力…

人工势场法matlab讲解,传统人工势场法(matlab)

【实例简介】 人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1994 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动…