首页 > 其他分享 >【搜索】【模板】记忆化搜索

【搜索】【模板】记忆化搜索

时间:2024-07-22 09:21:11浏览次数:15  
标签:return int 是否 dfs vis 记忆 搜索 模板

记忆化搜索

思想

是实现 DP 的一种手段。

优点:

  1. 不关心递推顺序;
  2. 对于两维及以上的 DP,方便处理初始状态和无效状态。

缺点:

无法使用滚动数组。

注意事项:

  1. 要什么状态搜什么状态;
  2. 所有的状态转移都要采取直接搜索的数据很傻
  3. 越界的状态不能赋值。

实现步骤:

  1. 先判断是否越界,如果越界则返回对结果不会造成影响的结果,比如求最大值就返回极小值,求方案数就返回 \(0\);
  2. 判断是否已经搜索;
  3. 判断障碍物;
  4. 判断是否可以结束搜索(是否到达初始状态);
  5. 处理普通状态转移。

例题

P1057 [NOIP2008 普及组] 传球游戏

思路

dfs(step, p) 表示在 \(step\) 步传到了 \(p\) 的方案数。

dfs(0, 0) 时返回 \(1\);

否则当 step 不等于 \(0\) 的时候返回 dfs(u - 1, (x + 1) % n) + dfs(u - 1, ((x - 1) + n) % n)

特别注意假设将 dfs(a, b) 的结果记录在 \(f_{i, j}\) 中,那么不能用 \(f_{i, j}\) 来判断是否搜索过,而是记录 \(vis_{a, b}\),表示是否遍历过,因为 \(f_{i, j} = 0\) 也有可能表示它没有方案数而不是没有访问过。如果直接判断 \(f_{i, j}\) 是否不等于 \(0\) 会导致 TLE。(或者 memset 成一个别的数字然后特判)。

代码
/*******************************
| Author:  SunnyYuan
| Problem: P1057 [NOIP2008 普及组] 传球游戏
| OJ:      Luogu
| URL:     https://www.luogu.com.cn/problem/P1057
| When:    2023-10-27 20:46:49
| 
| Memory:  125 MB
| Time:    1000 ms
*******************************/

#include <bits/stdc++.h>

using namespace std;

const int N = 40;

int f[N][N];
bool vis[N][N];
int n, m;

int dfs(int u, int x) {
    if (!u) return f[u][x] = (x == 0);
    if (vis[u][x]) return f[u][x];
    vis[u][x] = true;
    return f[u][x] = dfs(u - 1, (x + 1) % n) + dfs(u - 1, ((x - 1) + n) % n);
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n >> m;
    cout << dfs(m, 0) << '\n';
    return 0;
}

标签:return,int,是否,dfs,vis,记忆,搜索,模板
From: https://www.cnblogs.com/Yuan-Jiawei/p/18315349

相关文章

  • 【数学】【模板】扩展欧几里得算法
    扩展欧几里得算法思想首先回忆一下裴蜀定理:对于任意一对不全为\(0\)的整数\(a,b\),存在\(x,y\)使得\(ax+by=\gcd(a,b)\)。扩展欧几里得算法就是求出一组解满足\(ax+by=\gcd(a,b)\),这里用到了欧几里得算法,不会的,可以看看我的博客。我们看看怎么求:当\(b=......
  • 【数学】【模板】欧拉定理
    欧拉定理思想若\(a\)与\(n\)互质,则\(a^{\varphi(n)}\equiv1\pmodn\);容易得出当\(n\)为质数时,\(a^{n-1}\equiv1\pmodn\)。证明假设与\(1\simn\)中与\(n\)互质的数字为\(x_1,x_2,x_3,\cdotsx_{\varphi(n)}\),且两两不同。现将它们全部乘以\(a\)得......
  • 【数学】【模板】欧拉函数
    欧拉函数思想\(\varphi(n)\)表示的是\(1\simn\)中与\(n\)互质的个数。怎么求\(\varphi(n)\)呢?先将\(n\)质因数分解:\(n=p_1^{a_1}p_2^{a_2}\cdotsp_k^{a_k}\),那么\(\varphi(n)=n\left(1-\dfrac{1}{p_1}\right)\left(1-\dfrac{1}{p_2}\right)\cdots\left......
  • 【数学】【模板】欧几里得算法
    欧几里得算法思想\[\gcd(a,b)=\gcd(b,a\bmodb)\]证明\(\gcd(a,b)=\gcd(b,a\bmodb)\):首先,如果有\(d|a\),\(d|b\),那么\(d|ax+by\)。然后,\(a\bmodb=a-\left\lfloor\dfrac{a}{b}\right\rfloorb\)。假设\(p=\gcd(a,b)\),那么\(p|......
  • 【搜索】【模板】A* 算法
    学了IDA*,然后学学A*。A*A*可以简单理解为在bfs的时候分个先后,哪个最有可能先到达就先走哪一步。A*是在某个最短路问题中(比如求最小的步骤等),如果所有边权都是非负的,那么就可以使用启发函数来优化bfs过程。例题P1379八数码难题思路我们在bfs的过程中加入函数\(h......
  • 【数据结构】【模板】莫队
    莫队使用场景离线算法;区间询问不断修改。能用\(O(1)\)的时间复杂度从\([l,r]\)到\([l+1,r]\)或者\([l,r-1]\)。原理原问题可以转化为为建立一个坐标轴,对于一个询问\((l,r)\),相当于点\((l,r)\),从一个询问\((a,b)\)到\((c,d)\),可以理解为点\((a,b)......
  • 【图论】【模板】差分约束系统
    差分约束系统差分约束系统是将不等式组的问题转化为图论问题。前置知识判断负环例题P5960【模板】差分约束算法思路我们将\(x_u-x_v\ley_u\)换为\(x_u\lex_v+y_u\)。然后我们建立一条连接\(v,u\)(注意是\(v,u\)不是\(u,v\))权值为\(y_u\)的边。我们发......
  • 【图论】【模板】最长路、最短路
    最短路Dijkstra算法思路Dijkstra算法,采用贪心思想,在某一时刻如果\(dis\)数组中\(dis_u\)最小,那么就固定\(u\),\(dis_u\)一定是\(1\rightarrowu\)的最短路径,然后我们再通过\(u\)更新与\(u\)有边相连的\(v\),如果\(dis_v>dis_u+w\),那么\(dis_v=dis_u+w\)......
  • 【图论】【模板】判断负环
    使用SPFA算法判断负环前言判断负环是属于判定性的问题,常与二分结合起来。例题AcWing852.spfa判断负环思路可以使用SPFA进行判断。因为两点之间至多有\(n-1\)条边,所以当一个点的最短路径经过的边数大于等于\(n\)时,说明有负环。代码#include<bits/stdc++.h>......
  • 【搜索】【模板】模拟退火
    前置知识自然对数、分数次幂、概率。前言模拟退火可以在我们想不到题目正解的时候试一试其实就是骗分方法。因为纯随机得出正确答案的概率非常低,所以我们就可以加一定的优化,使找到答案概率增大。算法思想温度(步长):每次选择一个范围进行搜索,在搜索过程中范围不断缩小,最后到很......