算法:穷举,暴搜,深搜,回溯,剪枝

文章目录

  • 算法基本思路
  • 例题
    • 全排列
    • 子集
    • 全排列II
    • 电话号码和字母组合
    • 括号生成
    • 组合
    • 目标和
    • 组合总和
    • 优美的排列
    • N皇后
    • 有效的数独
    • 解数独
    • 单词搜索
    • 黄金矿工
    • 不同路径III
  • 总结

算法基本思路

穷举–枚举

  1. 画出决策树
  2. 设计代码

在设计代码的过程中,重点要关心到全局变量,dfs函数,和细节问题,例如有回溯,剪枝,递归出口等问题

例题

全排列

在这里插入图片描述
画出该全排列的决策树:

在这里插入图片描述
因此筛选思路也就有了,从给定的vector开始选,每选择了一个就将选的元素的下标标记为true,代表选过了,递归到下一次进行选择的时候,如果要选的元素的下标是false,代表还没有选过,就可以被选,回溯后要回复现场

class Solution 
{
public:// 设计全局变量vector<vector<int>> ret; // 返回的二维数组vector<int> path; // 二维数组中的元素bool check[7]; // 判断元素是否被统计过了void dfs(vector<int>& nums){// 递归出口if(path.size() == nums.size()){ret.push_back(path);return;}for(int i=0;i<nums.size();i++){// 如果该字符没有被统计过就进行统计if(check[i] == false){path.push_back(nums[i]);check[i] = true;// 进入递归dfs(nums);// 回溯和恢复现场path.pop_back();check[i] = false;}}}vector<vector<int>> permute(vector<int>& nums) {dfs(nums);return ret;}
};

子集

在这里插入图片描述
对于这个题有两种决策方案:
第一种决策方案是,对于nums数组中的每一个元素,都看它是否需要被选,可以选择要被选,也可以选择不被选
第二种决策方案是,对于path数组中的元素个数,可以为一个,也可以为两个,也可以为三个,直到和nums数组中元素的个数一样

决策1:
在这里插入图片描述

class Solution 
{
public:vector<vector<int>> ret; // 返回值vector<int> path; // 数组中的元素void dfs(vector<int>& nums, int pos){for(int i=pos;i<nums.size();i++){// 选path.push_back(nums[i]);dfs(nums,i+1);// 不选path.pop_back();}ret.push_back(path);}vector<vector<int>> subsets(vector<int>& nums) {dfs(nums,0);return ret;}
};

决策2:

在这里插入图片描述

class Solution 
{
public:vector<vector<int>> ret; // 返回值vector<int> path; // 数组中的元素void dfs(vector<int>& nums, int pos){ret.push_back(path);for(int i=pos;i<nums.size();i++){// 数组中元素的个数path.push_back(nums[i]);dfs(nums,i+1);// 回溯+恢复现场path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {dfs(nums,0);return ret;}
};

全排列II

在这里插入图片描述
前面有做过一道全排列,这个题和前面题的不同点就是多了相同元素,因此对于剪枝的策略有不同,下面首先画出它的决策树

在这里插入图片描述
从决策树中可以看出这个题的剪枝方案

  1. 在同一个节点,相同的数不能被选两次 — 比较这个数有没有被选过
  2. 在不同的节点,已经被选过的数就不能被选了 — check数组
class Solution 
{
public:// 设计全局变量vector<vector<int>> ret;vector<int> path;bool check[9];void dfs(vector<int>& nums){// 递归终止条件if(path.size() == nums.size()){ret.push_back(path);return;}for(int i = 0; i < nums.size(); i++){// 剪枝的条件:当前节点没用过并且前面没出现过if(check[i] == false && (i == 0 || nums[i] != nums[i-1] || check[i-1])){path.push_back(nums[i]);check[i] = true;dfs(nums);// 回溯check[i] = false;path.pop_back();}}}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(),nums.end());dfs(nums);return ret;}
};

电话号码和字母组合

在这里插入图片描述

class Solution 
{
public:// 全局变量string arr[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};vector<string> ret;string path;// 决策:取digits中每一个数字对应的字符串中的元素,直接取即可void dfs(string& digits, int pos){// 递归终止条件if(path.size() == digits.size()){ret.push_back(path);return;}for(auto e : arr[digits[pos] - '0']){path += e;dfs(digits, pos+1);// 回溯+恢复现场path.pop_back();}}vector<string> letterCombinations(string digits) {if(digits.size() == 0)return ret;dfs(digits, 0);return ret;}
};

括号生成

在这里插入图片描述

首先画出这个题的决策树,观察决策树的剪枝情况

在这里插入图片描述
从中可以看出,这个题的剪枝条件是,右括号的数量不能大于左括号的数量,并且左括号的数量不能大于n

全局变量如何设计?答案存储在一个数组中,每一个path也要有一个字符串用以描述

递归函数头如何设计?首先必须要知道n是多少,其次要知道左括号现在有多少,右括号现在有多少

递归函数的实现细节:递归终止条件是path的长度等于n的2倍,回溯要将最后插入的部分删除掉

因此函数就很好实现了:

class Solution
{
public:vector<string> res;string path;void dfs(int n, int left, int right){// 递归终止条件if (path.size() == n * 2){res.push_back(path);return;}// 添加左括号的剪枝条件if (left < n){path += '(';left++;dfs(n, left, right);// 回溯+恢复现场path.pop_back();left--;}// 添加右括号的剪枝条件if (left > right){path += ')';right++;dfs(n, left, right);// 回溯+恢复现场path.pop_back();right--;}}vector<string> generateParenthesis(int n){dfs(n, 0, 0);return res;}
};

组合

在这里插入图片描述

画出决策树

在这里插入图片描述

这里要注意这两个条件,其实在代码中是不需要专门体现的,首先,选过的不能再选,也就是说子集的元素都是升序排列的,那么只需要在递归的时候直接从当前位置的下一个位置开始找数即可

check数组的存在意义?

通过这个题,对于check数组有了更多的理解,check数组存在的意义是,选完一个数后,在选第二个数的过程中,需要从头再次开始选的时候,为了避免会重复选用,因此会有check数组来用以标记,但是在这个题中,选了一个数以后,选第二个数直接从这个数的下一个数开始选就可以了,因此实际上是不需要check数组来帮忙的

class Solution
{
public:// 定义全局变量vector<vector<int>> ret;vector<int> path;bool check[25];void dfs(int n, int k, int pos){// 递归终止条件if (path.size() == k){ret.push_back(path);return;}for (int i = pos; i <= n; i++){path.push_back(i);dfs(n, k, i + 1);// 回溯+恢复现场path.pop_back();}}vector<vector<int>> combine(int n, int k){dfs(n, k, 1);return ret;}
};

目标和

在这里插入图片描述

首先画出它的决策树,从中可以看出它和子集的那道题有异曲同工之处,在此基础上,对这个决策树进行实现

在这里插入图片描述

class Solution
{
public:// 定义全局变量int count;void dfs(vector<int>& nums, int target, int pos, int path){if (pos == nums.size()){if (path == target)count++;return;}dfs(nums, target, pos + 1, path + nums[pos]);dfs(nums, target, pos + 1, path - nums[pos]);}int findTargetSumWays(vector<int>& nums, int target){dfs(nums, target, 0, 0);return count;}
};

组合总和

在这里插入图片描述

决策树

在这里插入图片描述
如果在不考虑去重的情况下,这样的决策树是可以的,但是这里题目要求有要去重的阶段,因此就需要考虑剪枝的问题

如何剪枝?

对于数据的选择,如果先选了2,再选3,那么在选3的时候就不应该再选2,因此剪枝的策略就是选的时候不选前面的,因为如果前面的能选,那么在前面选的时候一定选了后面的,所以只需要向前进行寻找即可,不用管后面的部分

在这里插入图片描述
这样的决策树才理应是正确的决策树

class Solution 
{
public:// 定义全局变量vector<vector<int>> ret;vector<int> path;void dfs(vector<int>& candidates, int target, int pos, int sum){// 递归终止条件if(sum == target){ret.push_back(path);return;}if(sum > target)return;for(int i = pos; i < candidates.size(); i++){path.push_back(candidates[i]);dfs(candidates, target, i, sum + candidates[i]);// 回溯+恢复现场path.pop_back();}}vector<vector<int>> combinationSum(vector<int>& candidates, int target) {dfs(candidates, target, 0, 0);return ret;}
};

这是其中一种决策方案,下面提供决策的第二种思路

在数据选择方面,假设现在有2,3,5三个数字,可以对其中的每个数字选不同的次数,例如选0次,1次,2次…

优美的排列

在这里插入图片描述

一开始第一反应是,先把数组搞出来,再进行判断,但这样会超时,意味着有些地方需要被优化

// 超时
class Solution 
{// 思路:全排列出来数据,然后判断是否优美
public:// 全局变量bool check[20];vector<int> path;int count;bool check_perm(const vector<int>& nums){for(int i = 0; i < nums.size(); i++){if(max(nums[i],i+1) % min(nums[i],i+1) != 0)return false;}return true;}void dfs(int n){// 递归终止条件if(path.size() == n){if(check_perm(path)) count++;return;}for(int i = 0; i < n; i++){if(check[i] == false){path.push_back(i + 1);check[i] = true;dfs(n);// 回溯现场path.pop_back();check[i] = false;}}}int countArrangement(int n) {dfs(n);return count;}
};

N皇后

在这里插入图片描述

关于check判断,还可以使用类似于哈希表的解法,在下一道题中进行使用

class Solution
{
public:// 全局变量int _n;vector<vector<string>> ret;vector<string> path;// 构建皇后摆放情况string con_string(int pos, int n){string tmp;for (int i = 0; i < pos; i++)tmp += '.';tmp += 'Q';while (tmp.size() != n)tmp += '.';return tmp;}// 判断能不能在第i行的pos位置放置皇后bool check(int i, int pos){// 判断列for (int j = 0; j < i; j++){if (path[j][pos] == 'Q')return false;}// 判断主对角线for (int j = 1; i - j >= 0 && pos + j < _n; j++){if (path[i - j][pos + j] == 'Q')return false;}// 判断次对角线for (int j = 1; i - j >= 0 && pos - j >= 0; j++){if (path[i - j][pos - j] == 'Q')return false;}return true;}void dfs(int n, int pos){// 终止条件if (pos == n){ret.push_back(path);return;}for (int i = 0; i < n; i++){// 剪枝判断pos行的i位置是否可以放皇后,如果成功就放到棋盘中if (check(pos,i)){// 构建出当前皇后摆放情况string tmp = con_string(i, n);path.push_back(tmp);// 递归到下一层去判断dfs(n, pos + 1);// 回溯 恢复现场path.pop_back();}}}vector<vector<string>> solveNQueens(int n){_n = n;dfs(n, 0);return ret;}
};

有效的数独

在这里插入图片描述
此题就是利用了类似哈希表的方法

class Solution 
{
public:// 利用哈希表的原理来解题// 全局变量:col/row[i][j]表示第i行/列中j元素是否出现过,grid是把每个九宫格当成一个元素bool col[9][10];bool row[9][10];bool grid[3][3][10];bool isValidSudoku(vector<vector<char>>& board) {for(int i = 0; i < board.size(); i++){for(int j = 0; j < board[i].size(); j++){if(board[i][j] == '.') continue;if(col[i][board[i][j] - '0'] == false){col[i][board[i][j] - '0'] = true;}else{return false;}if(row[j][board[i][j] - '0'] == false){row[j][board[i][j] - '0'] = true;}else{return false;}if(grid[i / 3][j / 3][board[i][j] - '0'] == false){grid[i / 3][j / 3][board[i][j] - '0'] = true;}else{return false;}}}return true;}
};

解数独

在这里插入图片描述

解决本题需要依赖前面的思想


class Solution 
{
public:// 全局变量bool col[9][10];bool row[9][10];bool grid[3][3][10];void solveSudoku(vector<vector<char>>& board) {for(int i = 0; i < 9; i++){for(int j = 0; j < 9; j++){if(board[i][j] != '.'){col[j][board[i][j] - '0'] = true;row[i][board[i][j] - '0'] = true;grid[i / 3][j / 3][board[i][j] - '0'] = true;}}}dfs(board);}bool dfs(vector<vector<char>>& board){// 构造行和列for(int i = 0; i < 9; i++){for(int j = 0; j < 9; j++){if(board[i][j] == '.'){for(int num = 1; num <= 9; num++){// 剪枝if(!row[i][num] && !col[j][num] && !grid[i / 3][j / 3][num]){board[i][j] = num + '0';row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = true;if(dfs(board) == true)return true;// 回溯+恢复现场board[i][j] = '.';row[i][num] = col[j][num] = grid[i / 3][j / 3][num] = false;}}return false;}}}return true;}
};

单词搜索

在这里插入图片描述
本题是使用的是矩阵中的搜索,有些类似于迷宫问题

其中需要注意的是在判断上下左右是否有内容的时候,要使用的是一个向量来标记,这样就可以避免写四层循环带来的代码冗余,在解决矩阵搜索的内容中这样的方法很方便使用

class Solution
{
public:// 全局变量 m为行数,n为列数int m;int n;string target;bool status;string path;bool check[7][7];int dx[4] = {0, 0, -1, 1};int dy[4] = {1, -1, 0, 0};// pos代表的是现在正在寻找的元素对应的下标void dfs(vector<vector<char>>& board, int p, int q, int pos){if (pos == target.size()){status = true;return;}// 去这个格子上下左右进行寻找for(int i = 0; i < 4; i++){int row = p + dx[i];int col = q + dy[i];if (row < m && row >= 0 && col < n && col >= 0 && board[row][col] == target[pos] && check[row][col] == false){// 说明找到了,到下一层去找找check[row][col] = true;path.push_back(board[row][col]);dfs(board, row, col, pos + 1);// 回溯 恢复现场check[row][col] = false;path.pop_back();}}}bool exist(vector<vector<char>>& board, string word){m = board.size();n = board[0].size();target = word;// 此时说明已经找到了target[0],于是可以继续寻找path.push_back(target[0]);for (int i = 0; i < board.size() && status == false; i++){for(int j = 0; j< board[i].size(); j++){if(board[i][j] == target[0]){check[i][j] = true;dfs(board, i, j, 1);check[i][j] = false;}}}return status == true;}
};

黄金矿工

在这里插入图片描述
策略:找到有黄金的格子,从这个格子开始进行深度优先遍历,每次遍历到找不见路就停止,中间记录黄金数

class Solution
{// 策略:找到有黄金的格子,从这个格子开始进行深度优先遍历,每次遍历到找不见路就停止,中间记录黄金数
public:// 全局变量int res;  // 获得黄金最多的数量bool check[16][16];  // 判断这个格子有没有走过// 定义偏移量int dx[4] = { 0, 0, 1, -1 };int dy[4] = { 1, -1, 0, 0 };// 从第i行第j列开始开采,开采量是pathvoid dfs(vector<vector<int>>& grid, int i, int j, int path){res = max(res, path);for (int k = 0; k < 4; k++){int x = dx[k] + i, y = dy[k] + j;// 剪枝 如果这个格子有矿并且没有被走过if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size() && grid[x][y] != 0 && check[x][y] == false){check[x][y] = true;dfs(grid, x, y, path + grid[x][y]);// 回溯和恢复现场check[x][y] = false;}}}int getMaximumGold(vector<vector<int>>& grid){for (int i = 0; i < grid.size(); i++){for (int j = 0; j < grid[i].size(); j++){if (grid[i][j] != 0){// 标记该处已经被开采了check[i][j] = true;// 从i j开始开采,开采量是grid[i][j]dfs(grid, i, j, grid[i][j]);// 回溯和恢复现场check[i][j] = false;}}}return res;}
};

不同路径III

在这里插入图片描述

class Solution 
{
public:bool check[21][21];int ret;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int step;void dfs(vector<vector<int>>& grid, int i, int j, int count){if(grid[i][j] == 2){if(count == step)ret++;return;}for(int k = 0; k < 4; k++){int x = i + dx[k], y = j + dy[k];if(x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size() && grid[x][y] != -1 && check[x][y] == false){check[x][y] = true;dfs(grid, x, y, count + 1);check[x][y] = false;}}}int uniquePathsIII(vector<vector<int>>& grid) {int x, y;for(int i = 0; i < grid.size(); i++){for(int j = 0; j < grid[0].size(); j++){if(grid[i][j] == 1){x = i;y = j;}else if(grid[i][j] == 0){step++;}}}step += 2;check[x][y] = true;dfs(grid, x, y, 1);return ret;}
};

总结

其实从这些题中不难看出,画出决策树的过程并不困难,困难的是对于代码变现能力,因此在掌握代码变现的能力后再解决问题就很轻松了

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在windows上利用vmware17 搭建centos7 mini版本服务器

安装centos7mini 修改名称和安装路径 也可以点击自定义硬件&#xff0c;进行硬件配置修改 设置内存 设置处理器 点击下图按钮进行设置 点击done 点击开始安装 点击设置root密码 设置成功&#xff0c;点击done &#xff0c;root密码设置的简单的话需要按两次done 等待安装完成…

【算法与数据结构】46、47、LeetCode全排列I, II

文章目录 一、46.全排列I二、47.全排列II三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、46.全排列I 思路分析&#xff1a;本题要求是全排列&#xff0c;意味着每次递归的时候startIndex都要从0开始&#xff0c;否则…

Java排序算法之归并排序

图解 归并排序是一种效率比较高的分治排序算法&#xff0c;主要分为两个步骤&#xff0c;分别为“分”和“并”。 分&#xff1a;将序列不断二分&#xff0c;直到每个子序列只有一个元素为止。 并&#xff1a;将相邻两个子序列进行合并&#xff0c;合并时比较两个子序列的元素…

数字人,虚拟数字人——你看好数字人领域的发展吗?

你看好数字人领域的发展吗&#xff1f; 目录 一、虚拟人、数字人、虚拟数字人基本概念 1.1、虚拟人&#xff08;Virtual Person&#xff09; 1.2、 数字人&#xff08;Digital Human&#xff09; 1.3、虚拟数字人&#xff08;Virtual Digital Human&#xff09; 1.4、侧重…

牛客网:OR36 链表的回文结构

一、题目 函数原型&#xff1a; bool chkPalindrome(ListNode* A) 二、思路 判断一个单链表是否为回文结构&#xff0c;由于单链表不能倒序遍历&#xff0c;所以需要找到单链表的后半段&#xff0c;并将其逆置&#xff0c;再与前半段链表进行比较。 如何找到单链表的后半段呢&a…

Scala---方法与函数

一、Scala方法的定义 有参方法&无参方法 def fun (a: Int , b: Int) : Unit {println(ab) } fun(1,1)def fun1 (a: Int , b: Int) ab println(fun1(1,2)) 注意点&#xff1a; 方法定义语法 用def来定义可以定义传入的参数&#xff0c;要指定传入参数的类型方法可以写返…

CSS的初步学习

CSS 层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结 构分离. CSS 就是 “东方四大邪术” 之化妆术 CSS 基本语法规范: 选择器 若干属性声明 选择器决定针对谁修改 (找谁) 声明决定修…

uniapp 小程序 身份证 和人脸视频拍摄

使用前提&#xff1a; 已经在微信公众平台的用户隐私协议&#xff0c;已经选择配置“摄像头&#xff0c;录像”等权限 开发背景&#xff1a;客户需要使用带有拍摄边框的摄像头 &#xff0c;微信小程序的方法无法支持&#xff0c;使用camera修改 身份证正反面&#xff1a; <…

IDEA 2022创建Spring Boot项目

首先点击New Project 接下来&#xff1a; (1). 我们点击Spring Initializr来创建。 (2). 填写项目名称 (3). 选择路径 (4). 选择JDK------这里笔者选用jdk17。 (5). java选择对应版本即可。 (6). 其余选项如无特殊需求保持默认即可。 然后点击Next。 稍等一会&#xff0c…

[Android]修改应用包名、名称、版本号、Icon以及环境判断和打包

1.修改包名 在Android Studio中更改项目的包名涉及几个步骤&#xff1a; 打开项目结构: 在Android Studio中&#xff0c;确保您处于Android视图模式&#xff08;在左侧面板顶部有一个下拉菜单可以选择&#xff09;。 重命名包名: 在项目视图中&#xff0c;找到您的包名&…

Mac M2/M3 芯片环境配置以及常用软件安装-前端

最近换了台新 Mac&#xff0c;所有的配置和软件就重新安装下&#xff0c;顺便写个文章。 一、环境配置 1. 安装 Homebrew 安装 Homebrew【Mac 安装 Homebrew】 通过国内镜像安装会比较快 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Ho…

msys2 + MSVC(VS2019)编译ffmpeg6.0源码

以前使用的v1.2版&#xff0c;很多功能和使用方法发生了变化&#xff0c;需要重新编译新的ffmpeg版。 编译环境: windows 10 , VS2019, MSYS2 1. msys2 下载安装 MSYS2 , https://www.msys2.org/ 2. msys2 环境配置打开 msys2 2.1 安装相关软件 然后输入以下命令安装&…

技术贴 | SQL 执行 - 执行器优化

本期技术贴主要介绍查询执行引擎的优化。查询执行引擎负责将 SQL 优化器生成的执行计划进行解释&#xff0c;通过任务调度执行从存储引擎里面把数据读取出来&#xff0c;计算出结果集&#xff0c;然后返回给客户。 在关系型数据库发展的早期&#xff0c;受制于计算机 IO 能力的…

【Python】AppUI自动化—appium自动化元素定位、元素事件操作(17)下

文章目录 前言一.Appium 元素定位1.定位方式种类2.如何定位2.1 id定位2.2 className定位2.3 content-desc 定位2.4 Android Uiautomator定位4.1 text定位4.2 text模糊定位4.3 text正则匹配定位4.4 resourceId定位4.5 resourceId正则匹配定位4.6 className定位4.7 className正则…

Centos7下mbr主引导记录演示

linux mbr主引导记录演示 dd if/dev/sda ofmbr.bin bs446 count1 dd if/dev/sda ofmbr.bin bs446 count1hexdump -C mbr.bin[rootlocalhost ~]# cd /boot/grub2 [rootlocalhost grub2]# ls [rootlocalhost grub2]# grub2-editenv list #默认引导内核查看 [rootlocalhost g…

VS项目属性变量

VS项目属性变量 $(SolutionDir) 获取解决方案的路径 $(Platform) 平台名字 → x86 / x64 $(ProjectName) 工程名字 $(Configuration) 当前的项目模式 → Debug / Release

用 Raspberry Pi 5 构建文件服务器(NAS)

系列文章目录 文章目录 系列文章目录前言一、软件设置二、存储器设置三、配置总结 前言 2023 年 11 月 13 日 本-埃弗拉德 这个 #MagPiMonday 周一&#xff0c;学习如何利用 Raspberry Pi 5 的新功能制作更好的 NAS。本教程是 MagPi 推出的 Raspberry Pi 5 特辑的一部分。 M.…

【教3妹学编程-算法题】K 个元素的最大和

3妹&#xff1a;“太阳当空照&#xff0c;花儿对我笑&#xff0c;小鸟说早早早&#xff0c;你为什么背上炸药包” 2哥 :3妹&#xff0c;什么事呀这么开发。 3妹&#xff1a;2哥你看今天的天气多好啊&#xff0c;阳光明媚、万里无云、秋高气爽&#xff0c;适合秋游。 2哥&#x…

深度解析NLP定义、应用与PyTorch实战

1. 概述 文本摘要是自然语言处理&#xff08;NLP&#xff09;的一个重要分支&#xff0c;其核心目的是提取文本中的关键信息&#xff0c;生成简短、凝练的内容摘要。这不仅有助于用户快速获取信息&#xff0c;还能有效地组织和归纳大量的文本数据。 1.1 什么是文本摘要&#x…

多篇论文介绍-DSConv-原文

论文地址 https://arxiv.org/pdf/1901.01928v1.pdf 目录 01 改进 YOLOv5的交通灯实时检测鲁棒算法 01 作用 02 模型介绍 02 基于改进YOLOv7一tiny 算法的输电线路螺栓缺销检测 01 作用 02 模型介绍 03 结合注意力机制的 &#xff39;&#xff2f;&#xff2c;&#xff…