news 2026/6/15 17:57:55

《算法竞赛从入门到国奖》算法基础:搜索-记忆化搜索

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《算法竞赛从入门到国奖》算法基础:搜索-记忆化搜索

💡Yupureki:个人主页

✨个人专栏:《C++》 《算法》


🌸Yupureki🌸的简介:


目录

前言

1. Function

算法原理

实操代码

2. 天下第一

算法原理

实操代码

3. 滑雪

算法原理

实操代码


前言

记忆化搜索也是一种剪枝策略。通过一个”备忘录”,记录第一次搜索到的结果,当下一次搜索到这个状态时,直接在”备忘录”里面找结果。记忆化搜索,有时也叫动态规划。

1. Function

题目链接:

P1464 Function - 洛谷

算法原理

题目叙述的非常清楚,我们仅需按照「题目的要求」把「递归函数」写出来即可。但是,如果不做其余处理的话,结果会「超时」。因为我们递归的「深度」和「广度」都非常大

因此,可以在递归的过程中,把每次算出来的结果存在一张「备忘录」里面。等到下次递归进入「—模一样」的问题之后,就「不用傻乎乎的展开计算」,而是在「备忘录里面直接把结果拿出来」,起到大量剪枝的效果。

实操代码

#include <iostream> #include <string> using namespace std; typedef long long LL; const int N = 25; LL a, b, c; LL f[N][N][N]; LL dfs(LL a, LL b, LL c) { if (a <= 0 || b <= 0 || c <= 0) return 1; if (a > 20 || b > 20 || c > 20) return dfs(20, 20, 20); if (f[a][b][c]) return f[a][b][c]; if (a < b && b < c) return f[a][b][c] = dfs(a, b, c - 1) + dfs(a, b - 1, c - 1) - dfs(a, b - 1, c); else return f[a][b][c] = dfs(a - 1, b, c) + dfs(a - 1, b - 1, c) + dfs(a - 1, b, c - 1) - dfs(a - 1, b - 1, c - 1); } int main() { while (cin >> a >> b >> c) { if (a == -1 && b == -1 && c == -1) break; printf("w(%lld, %lld, %lld) = %lld\n", a, b, c, dfs(a, b, c)); } return 0; }

2. 天下第一

题目链接:

P5635 【CSGRound1】天下第一 - 洛谷

算法原理

用递归模拟整个游戏过程,谁先到0谁赢

而这题的关键在于如何判断平局的情况

关于平局,即双方都无法到达0,可以转化为双方都在循环

例如双方一开始的数字分别为x 和 y ,但兜兜转转又回到了x 和 y。如果有一个能到达0,那么在这个循环中早就跳出了,不会回到起点。因此我们定义一个set<pair<int,int>>,记录每次两个人的数的情况,如果发现在set中早就记录过了,那么说明循环了一次,谁也不会赢

实操代码

#include <iostream> #include <set> using namespace std; int p; int a, b; set<pair<int, int>> s;//记录两个人的数的情况 void dfs() { int tmp = (a + b) % p; if (tmp == 0) { cout << "1" << endl; return; } b = (a + b + b) % p; if (b == 0) { cout << "2" << endl; return; } a = tmp; if (s.find({ a,b }) != s.end())//set中存在该情况,则循环了 { cout << "error" << endl; return; } s.insert({ a,b }); dfs(); return; } int main() { int n; cin >> n>>p; while (n--) { s.clear(); cin >> a >> b; dfs(); } return 0; }

3. 滑雪

题目链接:

P1434 [SHOI2002] 滑雪 - 洛谷

算法原理

这题的关键点在于,我们可以选择任意一个格子滑雪,找到最长的路径、

我们当然可以无脑枚举,但时间复杂度过高可能超时,关键在于我们可能会走相同的路径

例如我们我们已经计算出了从某一个格子开始的最长路径,后续我们选择其他格子开始时,中途可能会再次到达该格子,因此如果我们先前记录了该最长路径,就不会再次往下递归了,因此我们需要一个数组来记录每个格子的最长路径

实操代码

#include <iostream> #include <vector> using namespace std; int dx[4] = { 0,0,1,-1 }; int dy[4] = { 1,-1,0,0 }; int n, m; vector<vector<int>> v; vector<vector<int>> mem;//记录从某个格子开始的最长路径 int ret = 0; int dfs(int row,int col) { if (mem[row][col] != 0)//先前已经记录了该格子的最长路径,那么就直接返回该值 return mem[row][col]; int sum = 1; for (int k = 0; k < 4; k++) { int i = row + dx[k]; int j = col + dy[k]; if (i < 0 || i >= n || j < 0 || j >= m || v[i][j] >= v[row][col]) continue; sum = max(dfs(i,j) + 1,sum); } return mem[row][col] = sum; } int main() { cin >> n >> m; v.resize(n); mem.resize(n); for (int i = 0; i < n; i++)//枚举从每个格子开始滑雪 { mem[i].resize(m); for (int j = 0; j < m; j++) { int num; cin >> num; v[i].push_back(num); } } int ret = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { ret = max(dfs(i, j),ret); } } cout << ret; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 13:45:16

老款Mac焕新指南:使用OpenCore Legacy Patcher升级macOS系统全攻略

老款Mac焕新指南&#xff1a;使用OpenCore Legacy Patcher升级macOS系统全攻略 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 一、基础认知&#xff1a;让老Mac重获新生的…

作者头像 李华
网站建设 2026/6/15 12:50:17

WorkshopDL:跨平台引擎驱动的Steam创意工坊模组管理解决方案

WorkshopDL&#xff1a;跨平台引擎驱动的Steam创意工坊模组管理解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL WorkshopDL是一款基于多引擎架构的跨平台Steam创意工坊…

作者头像 李华
网站建设 2026/6/14 14:03:52

为什么你的Qwen3-0.6B加载慢?可能是这个原因

为什么你的Qwen3-0.6B加载慢&#xff1f;可能是这个原因 你是不是也遇到过这样的情况&#xff1a;在Jupyter里运行ChatOpenAI调用Qwen3-0.6B&#xff0c;光是模型加载就卡住半分钟&#xff0c;invoke("你是谁&#xff1f;")迟迟没反应&#xff0c;GPU显存占用却早已…

作者头像 李华
网站建设 2026/6/15 11:20:40

邻接矩阵练习1--------LCP 07.传递信息

前言 当我把手机的时间根据自己的起床时间调整以后&#xff0c;一切都变得奇妙起来了&#xff0c;我感觉这样真的蛮神圣的&#xff0c;先试试再说。 题目&#xff1a;点这里 解法 class Solution { public:int matrix[10][10];// memset(matrix,0,sizeof(matrix));int N;//…

作者头像 李华
网站建设 2026/6/6 12:03:51

网易云音乐插件管理工具:BetterNCM Installer使用指南

网易云音乐插件管理工具&#xff1a;BetterNCM Installer使用指南 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer BetterNCM Installer是一款专注于网易云音乐插件管理的免费工具&…

作者头像 李华
网站建设 2026/6/15 8:22:39

本地多人游戏神器Nucleus Co-Op:开启单机游戏新玩法

本地多人游戏神器Nucleus Co-Op&#xff1a;开启单机游戏新玩法 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 还在为想和朋友一起玩单机游戏却只…

作者头像 李华