蓝桥杯历届试题 大臣的旅费 记忆化搜索DFS

深度优先搜索之记忆化dfs 文章目录前言朴素dfs的求解思路记忆化dfs的求解思路将整数按权重排序题目描述解题思路朴素dfs记忆化dfs小结矩阵中的最长递增路径题目描述解题思路朴素dfs记忆化dfs小结统计所有可行路径题目描述解题思路朴素dfs记忆化dfs小结学生出勤记录 II题目描述朴素dfs记忆化dfs小结“马”在棋盘上的概率题目描述记忆化dfs骑士拨号器题目描述记忆化dfs记忆化dfs与棋结语 前言 前不久,我写一篇bfs的进阶版双向bfs:广度优先搜索之双向bfs 这篇文章主要是讲述对于一些特定的bfs问题,可以使用两头齐搜的 阅读详情

历届试题 大臣的旅费  
时间限制:1.0s   内存限制:256.0MB
      
问题描述

很久以前,T王国空前繁荣。为了更好地管理国家,王国修建了大量的快速路,用于连接首都和王国内的各大城市。

为节省经费,T国的大臣们经过思考,制定了一套优秀的修建方案,使得任何一个大城市都能从首都直接或者通过其他大城市间接到达。同时,如果不重复经过大城市,从首都到达每个大城市的方案都是唯一的。

J是T国重要大臣,他巡查于各大城市之间,体察民情。所以,从一个城市马不停蹄地到另一个城市成了J最常做的事情。他有一个钱袋,用于存放往来城市间的路费。

聪明的J发现,如果不在某个城市停下来修整,在连续行进过程中,他所花的路费与他已走过的距离有关,在走第x千米到第x+1千米这一千米中(x是整数),他花费的路费是x+10这么多。也就是说走1千米花费11,走2千米要花费23。

J大臣想知道:他从某一个城市出发,中间不休息,到达另一个城市,所有可能花费的路费中最多是多少呢?

输入格式

输入的第一行包含一个整数n,表示包括首都在内的T王国的城市数

城市从1开始依次编号,1号城市为首都。

接下来n-1行,描述T国的高速路(T国的高速路一定是n-1条)

每行三个整数Pi, Qi, Di,表示城市Pi和城市Qi之间有一条高速路,长度为Di千米。

输出格式

输出一个整数,表示大臣J最多花费的路费是多少。

样例输入1
5
1 2 2
1 3 1
2 4 5
2 5 4
样例输出1
135
输出格式

大臣J从城市4到城市5要花费135的路费。



因为地图是一棵树,所以可以知道最终最长的路是以叶子为起点的,而且树中点到点的路径是唯一的。直接DFS超时,不给数据范围也是醉了。

所以记忆化搜索来剪枝以减少搜索的复杂度。


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>

using namespace std;

const int maxn = 100000;

struct Edge {
	int u, v, w;
	Edge() {}
	Edge(int u, int v, int w) : u(u), v(v), w(w) {}
};

struct Rem {
	int nextt, maxx;
	Rem() {}
	Rem(int nextt, int maxx) : nextt(nextt), maxx(maxx) {}
};

int n, maxx;
vector<int> G[maxn + 5], leaf;
vector<Edge> edges;
bool vis[maxn + 5];
map<int, Rem> m;  //int对应当前点,Rem.nextt为当前点出发最长路路径中下一点
                  //Rem.maxx为从当前点出发的最长路长

int f(int x) {
	return x * (x + 1) / 2 + 10 * x;
}

//dfs返回从s出发的最长路长
int dfs(int s) {
	int tmax = 0, indexx = 1;
	bool flag = false;
	for (int i = 0; i < G[s].size(); i++) {
		Edge &e = edges[G[s][i]];
		int u = e.u, v = e.v, w = e.w;
		if (!vis[v]) {
			flag = true;
			if (m.find(v) != m.end() && m[v].nextt != u) {  //由于树中两点间路径是唯一的
				if (m[v].maxx + w > tmax) {                 //所以只要不回头,一定是路径下一点
					tmax = m[v].maxx + w;
					indexx = v;
				}
			}
			else {
				vis[v] = true;
				int t = dfs(v) + w;
				if (tmax < t) {
					indexx = v;
					tmax = t;
				}
				vis[v] = false;
			}
		}
	}
	if (flag) {
		m[s] = Rem(indexx, tmax);  //从s出发最长路长为tmax
		return tmax;               //且可通过下一步走s->indexx这条边达到此路长
	}
	else {
		return 0;  //搜索到头,返回0
	}
}

int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n - 1; i++) {
		int p, q, d;
		scanf("%d%d%d", &p, &q, &d);
		edges.push_back(Edge(p, q, d));
		G[p].push_back(edges.size() - 1);
		edges.push_back(Edge(q, p, d));
		G[q].push_back(edges.size() - 1);
	}

	for (int i = 1; i <= n; i++) {
		if (G[i].size() == 1) {  //叶子
			leaf.push_back(i);
		}
	}
	memset(vis, false, sizeof(vis));
	maxx = 0;
	m.clear();
	for (int i = 0; i < leaf.size(); i++) {
		int u = leaf[i];
		if (m.find(u) != m.end()) {  //之前记忆过了,直接用
			maxx = max(maxx, m[u].maxx);
		}
		else {
			vis[u] = true;
			maxx = max(maxx, dfs(u));
			vis[u] = false;
		}
	}
	printf("%d\n", f(maxx));
	return 0;
}



深度优先搜索(DFS)剪枝:记忆化搜索(C++) 今天我们来讲一下深搜的剪枝方法中的一个:记忆化搜索。顾名思义,记忆化搜索就是让程序记住一些东西,然后可以在需要用的时候可以瞬间调用,不需要再进行一次复杂的计算!首先,记忆需要大脑来存储数据,什么来模拟大脑? 数组其次,记忆需要现有的知识用来记住,知识从哪里来? 以前求出的数据。这样,我们如果要用到以前求过的数据,就可以从数组中调用,可以大大提高我们程序的运行速度。 阅读详情

相关推荐

dfs和记忆化搜索-滑行

小蓝准备在一个空旷的场地里面滑行,这个场地的高度不一,小蓝用一个 n 行 m 列的矩阵来表示场地,矩阵中的数值表示场地的高度。对于所有评测用例,1 <= n <= 100,1 <= m <= 100,0 <= 高度 <= 10000。对于 30% 评测用例,1 <= n <= 20,1 <= m <= 20,0 <= 高度 <= 100。滑行的位置一次为 (2,1),(2,2),(2,3),(3,3),(3,2),(4,2),(4,3)。小蓝可以任意选择一个位置开始滑行,请问小蓝最多能滑行多远距离。

11 253

DFS(记忆化搜索)

THEME #include <cstdio> #include <iostream> using namespace std; int a[110][110],f[110][110]; int r,c; int MAX,maxn,ans; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; int dfs(int x,int y) { int i; if(f[x][y]!=0) return f[x][y.

qq_52531977的博客 362

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 270

滑雪

第二天叫醒我的不是闹钟,是梦想! 给定一个R行C列的矩阵,表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。 当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。 下面给出一个矩阵作为例子: 1 2 3 4 5 16 17 18...

qq_43690454的博客 376

自动驾驶仿真 (四)—— 基于PreScan与Simulink的AEB系统多场景验证

本文详细介绍了基于PreScan与Simulink的AEB系统多场景验证方法,涵盖标准场景搭建、复杂工况扩展及控制策略优化。通过仿真技术,显著降低测试成本并提升场景覆盖率,有效解决实车测试中的痛点问题。特别适用于自动驾驶领域的AEB系统开发与验证。

weixin_28273593的博客 248

从零到一:手把手教你构建自定义ReaxFF力场参数

本文手把手教你从零构建自定义ReaxFF力场参数,详解反应力场的动态键序机制与参数化逻辑。通过LAMMPS实战演示,涵盖训练数据准备、参数优化算法选择及性能优化技巧,助力研究人员精准模拟化学反应过程。适用于材料科学、催化研究等领域,特别适合已掌握分子动力学基础的进阶用户提升力场开发能力。

weixin_28365523的博客 1056

【算法】DFS系列之 记忆化搜索

记忆化搜索是一种典型的空间换时间的思想,可以看成带备忘录的爆搜递归。搜索的低效在于没有能够很好地处理重叠子问题。在搜索过程中,会有很多重复计算,如果我们能记录一些状态的答案,就可以减少重复搜索量。动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用。

NeeEk0的博客 2374

Win10系统内存占用异常飙升?三步排查法快速定位问题根源

本文针对Win10系统内存占用异常飙升问题,提供了一套三步排查法。首先利用任务管理器和资源监视器进行深度系统体检,定位隐形内存消耗者;其次通过干净启动和禁用非必要后台服务,揪出导致内存泄漏的第三方软件或驱动;最后进行终极深度清理,包括检查内存完整性、调整虚拟内存设置以及更新关键驱动程序,帮助用户快速恢复系统流畅运行。

weixin_29251567的博客 194

python蓝桥杯准备

python蓝桥杯题库

静妮子的博客 4588

23、工业物流中的多智能体路径规划与碰撞处理策略

本文探讨了工业4.0背景下工业物流中的多智能体路径规划(MAPF)与碰撞处理策略。分析了自动导引车(AGV)等移动资源的应用现状,综述了主流路径规划算法如A*、D*Lite、M*等,以及集中式与分布式碰撞检测方法。重点比较了五种碰撞避免策略:路径交叉、优先级、起始时间调整、无交叉路径和速度调整,提出了基于环境条件的策略选择流程,并通过流程图展示了评估、组合、测试与优化的全过程。文章强调应根据订单不确定性、时间约束、优先级和生产组织等因素综合选择或组合策略,以提升物流效率与系统可靠性。

mac99的博客 125

【Simulink教程案例9】基于simulink的BPSK,QPSK调制解调通信系统建模与仿真——使用simulink自带模块设计

BPSK (Binary Phase Shift Keying)-------二进制相移键控。是把模拟信号转换成数据值的转换方式之一,利用偏离相位的复数波浪组合来表现信息键控移相方式。BPSK使用了基准的正弦波和相位反转的波浪,使一方为0,另一方为1,从而可以同时传送接受2值(1比特)的信息。BPSK的映射关系如下所示:BPSK调制过程将输入的1010二进制数据中的0都转化为-1,使得非极性码变为极性码。

FPGA/MATLAB学习教程/源码/项目合作开发 3483

零碎蓝桥备战知识点

最小生成树(Kruskal和Prim算法):http://blog.youkuaiyun.com/luoshixian099/article/details/51908175 并查集:https://blog.youkuaiyun.com/niushuai666/article/details/6662911 莫比乌斯反演:https://blog.youkuaiyun.com/ACdreamers/article/details...

weixin_44264744的博客 284

【Unity】Gif图片播放插件(支持UI及模型纹理渲染两种模式)

unity本身不支持GIF格式文件直接渲染, 因此一般的做法是通过加载图片,通过代码控制其循环播放、停止等,模拟动画效果,本文简单介绍一下某个现有开源工具,感谢开源作者。

灵境引路人 4036

dfs记忆化搜索,动态规划

动态规划概念:给定一个问题,将其拆成一个个子问题,直到子问题可以直接解决。然后把子问题的答案保存起来,以减少重复计算。再根据子问题的答案反推,得出原问题解。

2303_76561497的博客 560

【11】科曼医疗——科曼医疗 嵌入式--面试,校招,面试问答记录

科曼医疗嵌入式校招面试记录:3位面试官分别考察应用层技术、底层技术和HR面。技术问题涵盖C++特性(多态、虚函数、指针与引用区别)、内存管理(malloc与new对比)、嵌入式基础(51最小系统、IIC/SPI协议)及项目经验(智能黑板擦专利项目)。同时考察了Linux使用经验、STM32开发及嵌入式操作系统认知。最后环节应聘者询问了开发环境及面试流程。面试内容全面覆盖嵌入式开发核心知识点。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1248

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法:DFS之记忆化搜索

本篇博客是关于 记忆化搜索 的练习题,每道题都超链接了力扣的网页,每道题都有详细的解答过程

一名还在努力学习技术的程序员的博客 961

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

DFS进阶--记忆化搜索

  对于状态可以一次性遍历而确定的类型--推荐使用记忆化搜索,一般额外用一个数组(f[], f[][])来记录当前位置的状态。最近做了好几道记忆化搜索题\dp题,先挂上来一道觉得较典型的记录下学习的轨迹。原题:食物链~   大量数据输入--快读优化;     复习了一下链式向前星存图:   1)head[point]可看作以point为起点的所有边的集合(本质上就是point的某个出度),数...

weixin_34343689的博客 357

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

记忆化搜索dfs(java)

dfs

m0_48630721的博客 1770

深度剖析记忆化搜索(非dp)

此文章意在从代码层面剖析记忆化搜索的核心关键,分析递归,回溯和返回之间的关系。适合记忆化入门者阅读,更适合搜索新手学习以强化对搜索的理解和认知

m0_64595440的博客 2295

[C++]洛谷 滑雪 dfs+记忆化搜索详解

[原题] [输入样例] 5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 [输出样例] 25 [解题思路] 给出一个m*n的矩阵grid,每一格代表一个高度,要求我们找到一条路径,满足高度严格递减且长度最长。显然,对于这种问题,我们可以枚举起点,并通过dfs来得到最长的路径。 对于dfs的过程也很好理解:向上下左右四个方向搜索,若下一格的高度小于本格,则继续搜索且长度++,直到找出最长的路径。

weixin_62712365的博客 1556

Poj-1088(记忆化搜索、DFS)

点击打开问题链接问题:给出一个R行C列的二维数组表, 求出这个表中的最长递增序列的长度,只能上下左右相邻。Sample Input5 5 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 Sample Output25错误:一开始直接普通的深搜,每一个点都深搜一遍,找出最大的。不出意料是超时的。正解:记忆化搜索,依然...

AC是绝对不可能的 1786

记忆化搜索+dfs

问题描述   小明想知道,满足以下条件的正整数序列的数量:   1. 第一项为 n;   2. 第二项不超过 n;   3. 从第三项开始,每一项小于前两项的差的绝对值。   请计算,对于给定的 n,有多少种满足条件的序列。 输入格式   输入一行包含一个整数 n。 输出格式   输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。 样例输入 4 样例输出 7 样例说明   以下是满足条件的序列:   4 1   4...

haobingqian_的博客 294

蓝桥杯练习——大臣的旅费

题目如下: 说是说求路费,但是实际上还是求最短路径值,可以使用BFS,这是一个递归算法: #include<iostream> #include<string.h> #define MAXSIZE 1003 using namespace std; int map[MAXSIZE][MAXSIZE] ;//定义邻阶矩阵 int km, n, sum, maxsu...

My Struggle 779

[ACM] FZU 2092 收集水晶 (DFS,记忆化搜索)

Problem Description shadow来到一片神奇的土地,这片土地上不时会出现一些有价值的水晶,shadow想要收集一些水晶带回去,但是这项任务太繁杂了,于是shadow让自己的影子脱离自己并成为一个助手来帮助自己收集这些水晶。 shadow把这片土地划分成n*m个小方格,某些格子会存在一些shadow和他的影子都无法穿越的障碍,比如巨石、树木、野兽等。shadow预先探测到

逆风的方向 更适合飞翔 1977

dfs之记忆化搜索(字符串匹配,位置相对变)

题目链接:http://acm.hdu.ed #include<iostream> #include<string.h> #include<stdio.h> using namespace std; char a[210],b[210],c[500]; int mark[210][210]; int n; int dfs(int i...

YE3485365的博客 249
上一篇: 团体程序设计天梯赛-练习集 L2-018. 多项式A除以B 模拟
下一篇: UVa348 - Optimal Array Multiplication Sequence 区间DP
Daemoonn
博客等级 码龄11年 42粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值