ACM记忆化DFS与基于优先队列的BFS

基本概念--记忆化DFS

使用数组保存已经算出来的值,在后续的计算中减少大量的重复计算,提高效率。(用于dp不方便,但是搜索方便的情况,可以提升效率。)

eg. 记忆化dfs求解斐波那契数列

int dfs(int n)
{if(fib[n]) return n;if(n==1 || n==2) fib[n] = 1;else fib[n] = (dfs(n-1)+dfs(n-2)) % 1000000007;return fib[n];
}

 

经典例题

猫和老鼠

        :将每一个位置所能得到的最优解都保存在一个二维数组中,每次调用dfs函数时都先判断这个位置的最优解是否曾经已经求出来了,假如求出来了直接返回就行了。

#include <cstdio>
#include <cstring>
using namespace std;int n, k, init[101][101], ans[101][101];    //init保存每个网格最初奶酪的值,ans保存从当前这个坐标出发能够得到的最优解
int moves[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int dfs(int x, int y);
int max(int x, int y) { return x > y ? x : y; }
bool ok(int x, int y) { return x <= n && y <= n && x > 0 && y > 0; }    //判断是否越界int main()
{while(scanf("%d%d", &n, &k), n != -1 && k!= -1){memset(ans, 0, sizeof(ans));for(int i = 1; i <= n; i++)for(int j = 1; j <= n; j++)scanf("%d", &init[i][j]);printf("%d\n", dfs(1, 1));}return 0;
}int dfs(int x, int y)    //返回从(x,y)出发得到的最优解
{int tempMax = 0;if(ans[x][y]) return ans[x][y];for(int i = 0; i < 4; i++)for(int j = 1; j <= k; j++){int xx = x + j*moves[i][0];int yy = y + j*moves[i][1];if(ok(xx, yy) && init[xx][yy] > init[x][y])tempMax = max(tempMax, dfs(xx, yy));}ans[x][y] = init[x][y] + tempMax;return ans[x][y];
}

How many ways

        :假如知道了从蓝色位置走到终点的方案数,那么从左上角(起点)走到终点的方案数也就知道了(所有蓝色方块方案数的和)。

#include <cstdio>
#include <cstring>
using namespace std;int n, m, t, map[101][101], ans[101][101];
int ok(int x, int y){ return x <= n && y <= m && x > 0 && y > 0; }
int dfs(int, int);int main()
{scanf("%d", &t);while(t--){scanf("%d%d", &n, &m);memset(ans, -1, sizeof(ans));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)scanf("%d", &map[i][j]);ans[n][m] = 1;printf("%d\n", dfs(1, 1));}return 0;
}int dfs(int x, int y)
{if(ans[x][y] > -1) return ans[x][y];ans[x][y] = 0;for(int i = 0; i <= map[x][y]; i++)for(int j = 0; j <= map[x][y]-i; j++)if(ok(x+i, y+j))ans[x][y] = (dfs(x+i, y+j)+ans[x][y]) % 10000;return ans[x][y];
}

 

基本概念--基于优先队列的BFS

优先队列(priority_queue):

  1. 在队尾加入元素
  2. 在队头删除元素
  3. 每次取出的时具有最高优先权的元素

基本用法

创建队列对象:priority_queue<元素类型> 队列名;

队列添加元素:队列名.push(元素名);

去掉最优元素:队列名.pop();

判断是否为空:队列名.empty();

返回队列大小:队列名.size();

访问最优元素:队列名.top();

假如需要对结构体数组定义“优先权”,那么就要重载运算符

eg. 保存三个整数的结构体,从前往后依次比较三个整数,从小往大排。

struct T
{int x, y, z;friend bool operater < (T t1, T t2){if(t1.x != t2.x) return t1.x > t2.x;if(t1.y != t2.y) return t1.y > t2.y;return t1.z > t2.z;}
};

 

经典例题

拯救丁爸

        :前来拯救的学生有多个时,可以反向思考(丁爸找学生的位置)。

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n, m, ans;
char map[201][201]; 
int mintime[201][201];
int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};struct state {int x, y, ti; friend bool operator < (state s1,state s2){return s2.ti < s1.ti;}
};state be;bool in(int x, int y) { return x >= 1 && y >= 1 && x <= n && y <= m && map[x][y] != '#'; }int bfs() 
{priority_queue<state> q;q.push(be);state cur, next;while (!q.empty()) {cur = q.top();mintime[cur.x][cur.y] = 1;if (map[cur.x][cur.y] == 'r') return cur.ti;q.pop();for (int i = 0; i < 4; i++) {next.x = cur.x + dir[i][0];next.y = cur.y + dir[i][1];if (in(next.x, next.y)) {next.ti = cur.ti+1;if (map[next.x][next.y] == 'x') next.ti++;if(!mintime[next.x][next.y]){q.push(next);mintime[next.x][next.y] = 1;}}}}return 0;
}int main() 
{while (cin >> n >> m) {ans = 0; memset(mintime, 0, sizeof(mintime));for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> map[i][j];if (map[i][j] == 'a') {be.x = i; be.y = j;be.ti = 0;}}}int t = bfs();if(t) cout << t << endl;else cout << "Poor Dingba has to stay in the prison all his life." << endl;}
}

哈夫曼编码

概念

  • 路径:由一个节点到另一个节点间的分支构成
  • 路径长度:路径上经过的分支数量
  • 树的路径长度:从树根到每一节点的路径长度之和
  • 带权路径长度:节点到根的路径长度与节点上权重的乘积
  • 树的带权路径长度:树中所有叶子节点的带权路径长度之和,WPL=\sum w_i\cdot l_i(Weighted Path Length)
  • 哈夫曼树:带权路径长度最小的树

作用:在发送报文时可以构造最少的01序列来表示所有字母。

特点:每一个码都不是另一个码的前缀,称为前缀码。(所以发电报的时候才不会产生歧义。)

:每次在优先队列中找两个最小的数,把它们的和插入优先队列。如此往复就可以得到一个哈夫曼树。

#include <iostream>
#include <string>
#include <cstring>
#include <queue>
using namespace std;string str;
int num[27];
int bfs();int main()
{while(cin >> str, str != "END"){memset(num, 0, sizeof(num));int len = str.size();for(int i = 0; i < len; i++){if(str[i] == '_') num[26]++;else num[str[i]-'A']++;}int res = bfs();printf("%d %d %.1f\n", len*8, res, len*8*1.0/res);}return 0;
}int bfs()
{int a, b, sum=0;priority_queue<int, vector<int>, greater<int> > Q;for(int i = 0; i <= 26; i++)if(num[i]) Q.push(num[i]);if(Q.size() == 1) sum = Q.top();while(Q.size() > 1){a = Q.top();Q.pop();b = Q.top();Q.pop();sum += a + b;Q.push(a+b);}return sum;
}

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

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

相关文章

idea Springboot 数码商城系统LayUI框架开发mysql数据库web结构java编程计算机网页

一、源码特点 springboot 数码商城系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot spring mybatis &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整…

<网络安全>《67 微课堂<第8课 常见网络安全厂商简介>》

奇安信科技集团股份有限公司 简称&#xff1a;奇安信 英文名称&#xff1a;QiAnXin Technology Group Co., Ltd. 成立时间&#xff1a;2014年 总部位置&#xff1a;中国北京 主营业务&#xff1a;提供企业级网络安全产品、安全解决方案和安全运营服务&#xff0c;专注于网络空…

SpringMVC请求、响应和拦截器的使用

SpringMVC请求 RequestMapping注解 RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系 RequestMapping注解可以作用在方法和类上 1. 作用在类上&#xff1a;第一级的访问目录 2. 作用在方法上&#xff1a;第二级的访问目录 3. 细节&#xff1a;路径可以不编写…

软件设计师:06-程序设计语言与语言处理程序基础

章节章节01-计算机组成原理与体系结构07 - 法律法规与标准化与多媒体基础02 - 操作系统基本原理08 - 设计模式03 - 数据库系统09 - 软件工程04 - 计算机网络10 - 面向对象05 - 数据结构与算法11 - 结构化开发与UML06 - 程序设计语言与语言处理程序基础12 - 下午题历年真题End -…

windows达梦安装

1.首先准备好windows安装系统&#xff0c;准备工作的做好&#xff0c;然后把素材包dm8_20230418_x86_win_64放进去&#xff0c;进行解压 解压完成之后&#xff0c;把dm8_20230418_x86_win_64再次进行解压&#xff0c;然后点击安装setup进行安装 然后点击接受进行下一步&#xf…

[BT]小迪安全2023学习笔记(第24天:Web攻防-SQL注入)

第24天 SQL注入原理 基于攻击者向应用程序输入字段中插入恶意的SQL代码&#xff0c;这些输入最终会被应用程序未经适当清洁或验证直接传递给数据库执行。当这些恶意输入与应用程序的原始SQL语句结合时&#xff0c;它们可以修改原始SQL查询的意图&#xff0c;允许攻击者执行未…

搭建Docker私有仓库registry

下载registry registry是Docker官方提供的仓库镜像 拉取镜像&#xff0c;不指定版本默认拉取最新版本镜像。 docker pull registry Using default tag: latest latest: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df4…

ZooKeeper命令和监控详解

ZooKeeper监控命令详解 在分布式系统中&#xff0c;ZooKeeper作为一个非常重要的协调服务&#xff0c;它的健康状态直接影响到整个系统的可靠性和稳定性。因此&#xff0c;对ZooKeeper进行有效监控是非常必要的。本文将详细介绍ZooKeeper提供的命令行工具zkCli.sh&#xff0c;…

vue2之过滤器

过滤器 过滤器的实现类似Django的过滤器。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>过…

Redis的过期键是如何处理的?过期键的删除策略有哪些?请解释Redis的内存淘汰策略是什么?有哪些可选的淘汰策略?

Redis的过期键是如何处理的&#xff1f;过期键的删除策略有哪些&#xff1f; Redis的过期键处理是一个重要的内存管理机制&#xff0c;它确保在键过期后能够释放相应的内存空间。Redis对过期键的处理主要依赖于其删除策略&#xff0c;这些策略包括被动删除&#xff08;惰性删除…

Mysql---库表操作

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.Mysql数据库简介 MySQL是一种关系型数据库管理系统&#xff0c;是最流行的开源数据库之一。它是由瑞典MySQL AB公司开发的&#xff0c;后来被Sun Microsystems收购&#xff0c;之后又被Oracl…

企业架构设计方法与实践中的架构治理演进、架构评估方法、架构成熟度模型

企业架构设计方法与实践中的架构治理演进、架构评估方法、架构成熟度模型。 架构治理演进: 架构治理是指通过设立和执行一套政策和程序,来管理和控制一个组织的架构活动。架构治理演进是一个持续的过程,需要根据组织的实际情况进行定期审查和调整。 在演进过程中,重点需要…

1 redis7概述

Redis7 1 Redis简介 Redis之所以称之为字典服务&#xff0c; 是因为 Redis 是一个 key-value存储系统。 支持存储的 value类型很多&#xff0c; 包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash&#xff08;哈希类型&#xff09;等。 Redis…

[java基础揉碎]多态数组

介绍: 多态数组就是有一个父类数组, 数组含有不同多个父类子类对象 解析: 新建一个person类, 有名字,年龄属性, 同时有个say方法 新建一个子类, 有一个成绩的属性,并重写了say方法, 加上了成绩 新建一个子类老师, 并有工资这个属性, 一样重写了say方法加上了这个属性 要求创…

efcore事务

在 Entity Framework Core (EF Core) 中&#xff0c;事务用于确保一系列数据库操作要么全部成功&#xff0c;要么全部失败&#xff0c;这对于保持数据的一致性非常重要。以下是使用 EF Core 实现事务的一个简单示例&#xff1a; 首先&#xff0c;请确保安装了 EF Core。如果你…

PyTorch学习笔记之基础函数篇(八)

6 线性代数运算 6.1 torch.mm()函数 torch.mm() 是 PyTorch 中的一个函数&#xff0c;用于执行矩阵乘法操作。这个函数会接受两个张量作为输入&#xff0c;并返回它们的矩阵乘积。 函数的基本语法如下&#xff1a; torch.mm(mat1, mat2) → Tensor参数说明&#xff1a; ma…

根据服务器系统选择对应的MySQL版本

1. 根据服务器系统选择对应的MySQL版本 MySQL有多个版本&#xff0c;选择对应的版本&#xff0c;重点信息是Linux的GLIBC版本号&#xff0c;Linux的版本、系统位数。 1.1 查看Linux的GLIBC版本号 通常libc.so会支持多个版本&#xff0c;即向前兼容&#xff0c;查看该文件中…

Linux lsattr命令教程:如何查看和理解文件属性(附实例详解和注意事项)

Linux lsattr命令介绍 lsattr命令是list attributes的缩写&#xff0c;主要用于列出Linux系统文件的属性。这个命令可以帮助我们了解文件的各种属性&#xff0c;比如是否可以被修改、删除等。 Linux lsattr命令适用的Linux版本 lsattr命令在大多数Linux发行版中都可以使用&a…

LLM预备知识、工具篇——LLM+LangChain+web UI的架构解析

目录 【常见名词】一、LLM的低资源模型微调二、向量数据库1、Milvus(v2.1.4)&#xff1a;云原生自托管向量数据库&#xff08;Ubuntu下&#xff09;1&#xff09;安装&#xff08;Docker Compose方式&#xff09;&#xff1a;2&#xff09;管理工具&#xff08;仅支持Milvus 2.…

RabbitMQ命令行监控命令详解

在分布式系统中&#xff0c;消息队列中间件如RabbitMQ扮演着至关重要的角色。为了保证系统的稳定性和高可用性&#xff0c;对RabbitMQ进行有效监控是必不可少的。本文将详细介绍RabbitMQ提供的命令行工具rabbitmqctl&#xff0c;这些工具可以帮助我们监控和管理RabbitMQ服务器。…