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;系统具有完整…

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…

搭建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>过…

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方法加上了这个属性 要求创…

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

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

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.…

rank() over, dense_rank() over, row_number() over的区别

rank() over, dense_rank() over, row_number() over的区别 --ROW_NUMBER() OVER 不需要考虑并列&#xff0c;即使查询出来的数值相同也会进行连续排名 SELECT NAME, STUNO, SUBJECT, SCORE, ROW_NUMBER() OVER(PARTITION BY SUBJECT ORDER BY SCORE DESC) TO_RANK FROM SCOTT…

Learn OpenGL 03 着色器

GLSL 着色器的开头总是要声明版本&#xff0c;接着是输入和输出变量、uniform和main函数。每个着色器的入口点都是main函数&#xff0c;在这个函数中我们处理所有的输入变量&#xff0c;并将结果输出到输出变量中。 一个典型的着色器有下面的结构&#xff1a; #version vers…

O2OA(翱途)开发平台系统安全-用户登录IP限制

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持对指定的用户设置可以连接的客户端计算机的IP地址&#xff0c;以避免用户在不安全的环境下访问系统。本篇主要介绍如何开启O2OA用户登录IP限制。 一、先决条件&#xff1a; 1、O2Server服务器正常运行&#xff0c;系统安装部…

PostgreSQL开发与实战(6.3)体系结构3

作者&#xff1a;太阳 四、物理结构 4.1 软件安装目录 bin //二进制可执行文件 include //头文件目录 lib //动态库文件 share //文档以及配置模版文件4.2 数据目录 4.2.1 参数文件 pg_hba.conf //认证配置文件 p…

C++ string详解+模拟实现

文章目录 写在前面1. string类的使用1.1 string类的构造1.2 string类的迭代器1.3 string类对象的容量操作1.4 string类对象的修改操作1.5 string类对象的非成员函数 2. string类的模拟实现2.1 模拟实现string类的默认成员函数2.2 模拟实现string类的迭代器2.3 模拟实现string类…

如何本地部署SeaFile文件共享服务并实现无公网IP访问内网本地文件

文章目录 1. 前言2. SeaFile云盘设置2.1 Owncould的安装环境设置2.2 SeaFile下载安装2.3 SeaFile的配置 3. cpolar内网穿透3.1 Cpolar下载安装3.2 Cpolar的注册3.3 Cpolar云端设置3.4 Cpolar本地设置 4.公网访问测试5.结语 1. 前言 现在我们身边的只能设备越来越多&#xff0c…

JavaWeb后端——分层解耦 IOC DI

分层/三层架构概述 三层架构&#xff1a;Controller、Service、Dao 解耦/IOC&DI概述 分层解耦 容器称为&#xff1a;IOC容器/Spring容器 IOC 容器中创建&#xff0c;管理的对象&#xff0c;称为&#xff1a;bean 对象 IOC&DI入门 实现 IOC&DI 需要的注解&#…