代码编织梦想

记忆化搜索是什么?

就是咱找过的东西不需要再花时间去找,节约了人力和时间不是吗?

(像激素调节一样,高效!!!!)

咱拿个例子来说:数字金字塔

这是经过整理以后的数据

 

 

 

 这种是通过递归画出它的搜索树,很直观对吧,那由此我们可以写出(看图可以得知上一次的答案 + 当前需要加上的数(左子树) = 右子树的数

 

 

 

但是这种写法肯定会超时,因为额、每一条路径都重复搜索了!!! 

//c表示记录从上到下的累加和

void dfs(int x,int y,int c)
{
    if(x == n-1)
    {
    if(c > ans)ans = c;
    return;
}
   dfs(x+1,y,c + a[x+1][y]);
   dfs(x+1,y+1,c+a[x+1][y+1]);
}

所以我们改造为下列这个图 

 

 

 

void dfs(int x,int y)
{
    if(f[x][y] != 0) return f[x][y];//记忆化搜索,如果有数被搜到了,那就直接取出来累加即可
    if(x == n-1)
    f[x][y] = a[x][y];
    else 
    f[x][y] = a[x][y] + max(dfs(x+1,y),dfs(x+1,y+1));//加完左子树再去回溯到右子树那边进行累加
    return f[x][y];
}

 其实类似于从下到上,逆向思维做这题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Demilly123/article/details/127778942

动态规划——浅谈记忆化搜索_lhf_hai的博客-爱代码爱编程

关于记忆化搜索,算法中还是搜索的步骤,记忆化搜索:算法上依然是搜索的流程,但是搜索到的一些解用动态规划的那种思想和模式作一些保存。 但是动态规划总的来说是递归(循环或者其他形式)的遍历所有情况,就会造成很多不必要的数据冗余。 就拿最经典的斐波那契数列为例: 斐波那契数列是数学家列昂纳多·斐波那契(Leonardoda Fibonacci[1]

浅谈搜索_dark_52的博客-爱代码爱编程

搜索作为最基础的算法之一是十分重要的,虽然思想简单但是使用得当后效果也会非常好。本文就从搜索的基础来讲(无图,语言混乱求轻喷)。 什么是搜索?   简单地理解就是通过暴力计算,枚举后去找到正确答案,比如1到10有几个奇数这个问题,从搜索的角度来考虑就是一个循环1到10每个判断一下是不是奇数,然后得出结果(也许此处比喻有点问题,但总体意思差不多)。遇到一

数位dp 记忆化搜索java_数位dp/记忆化搜索-爱代码爱编程

一、引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an - 1,定义交错和函数: f(x) = a0 - a1 + a2 - ... + ( - 1)n - 1an - 1 例如: f(321

浅谈斐波那契数列,简要理解递归以及记忆化搜索-爱代码爱编程

斐波那契数列当中, 我写的代码: int f(int n) {     if (n == 1 || n == 2)         return 1;     return f(n - 1) + f(n - 2); } 顺序: 例如我们输入5,根据公式会递推产生f(4)和f(3), 接着是f(4)优先产生分解,分解成f(3)和f(2), 再接着

记忆化搜索——浅谈dp_acwing2010的博客-爱代码爱编程

记忆化搜索 何为记忆化搜索 我们要先从搜索说起。搜索,是一个很不错的算法。 优点不少,缺点也不少。 优点没得好说: 1.骗分 2.水题 3.短! 4.好用 5.好调 缺点显而易见,那就是: TLE的痛 怎么办呢? 这时候就要请出我们的记忆化搜索了。记忆化 = 搜索 + dpdp有个弱点,那就是太难想了。but,dp很快,因为要啥有啥~ 分

浅谈自记忆函数-爱代码爱编程

浅谈自记忆函数 最近阅读《JavaScript忍者秘籍》看到了一种有趣的函数:自记忆函数。 简介 何为自记忆函数?书中提到: 记忆化(memoization)是一种构建函数的处理过程,能够记住上次计算结果