记忆化搜索(递归)讲解「建议收藏」

记忆化搜索(递归)讲解「建议收藏」记忆化搜索


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

记忆化的本质是:
先记录,后返回(记住:一定要记录,否则就是普通的递归);
如果表中有,则直接返回。

1.斐波那契写法:
1 ,1 ,2 ,3 ,5 ,8 ,13…

//结果 1134903170
#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long 
using namespace std;
ll f[1001];
//原始程序:
//int fac(int n)
//{ 
   
// if(n==1) return 1;
// else if(n==2) return 2;
// else return fac(n-1)+fac(n-2);
//}
//记忆化:
ll fac(int n)
{
    ll p;
    if(n==1 || n==2) return 1;
    if(f[n]!=-1) return f[n];//查找有,直接返回 
    p=fac(n-1)+fac(n-2);
    f[n]=p;//先记录后返回 
    return p;
}
int main()
{   
    int m=45;   
    memset(f,-1,sizeof f);
    cout<<fac(m)<<endl;     
}

2.NOIP2001数的计数
我们要求找出具有下列性质数的个数,先输入一个自然数n,然后对此自然数按照如下方法进行处理:
*.不做任何操作
*.在它左边加上一个自然数,但该自然数不能超过原数的一半;
*.加上数后,继续按照此规则进行处理,直到不能再次加入自然数为止。
输入:
8
输出:
10

分析:
输入为8,输入的可能性为:
8
48
38
28
18
248
148
138
128
1248

原代码:

int dfs(int t)
{
    int p=1;
    for(int i=1;i<=t/2;i++)
        p+=dfs(i);
    return p;
}

改进的代码(记忆化):

#include<iostream>
#include<cstdio>
#include<cstring> 
using namespace std;
int f[1001];
int dfs(int t)
{
    int p=1;
    if(f[t]!=-1) return f[t]; 
    for(int i=1;i<=t/2;i++)
        p+=dfs(i);
    f[t]=p;
    return p;
}
int main()
{
    int n;
    cin>>n;
    memset(f,-1,sizeof f); 
    cout<<dfs(n)<<endl;
 } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164444.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android2017-2018最新面试题(3-5年经验个人面试经历)

    2017-2018最新Android面试题版权声明:本文为博主原创文章,未经博主允许不得转载。原文链接:http://blog.csdn.net/huangqili1314/article/details/72792682大家好,在跟大家讲述自己的面试经历,以及遇到的面试题前,先说说几句题外话。接触Android已经3年,在工作中遇到疑难问题总是在网上(csdn大牛博客,stack…

    2022年4月10日
  • 计算机二级选择题——数据结构与算法[通俗易懂]

    计算机二级选择题——数据结构与算法[通俗易懂]按照自己的理解写的解题思路,如有错误希望指正。1.算法的复杂度: ①时间复杂度:执行算法所需的计算工作量(又叫:基本运算次数) ②空间复杂度:执行算法所需的内存 它们是没有任何关系的!!!2.求二叉树序列类题目 要点:前序—根左右 中序—左根右 后序—左右根 例1:已知前序ABCDE,中序BCADE,求后序;同类型,已知任意两个求第三个 解题思路: 由前序知道A是根,结合中序,CB是左子树,DE…

    2022年8月18日
  • 最全面的外包公司的解释

    最全面的外包公司的解释1.最新北京软件外包公司排行榜软件外包企业排名:北京华盛恒辉科技有限公司(北京)北京五木恒润科技有限公司(北京)东软集团Neusoft(沈阳)博彦科技BeyondSoft(北京)海辉软件HiSoft(大连)文思VanceInfo(北京)浙大网新Insigma(杭州)奥博杰天Objectiva(北京)浪潮Inspur(济南)软通动力iSoftStone(北京)2.国内一些比…

    2022年5月29日
  • 股票模拟交易_复杂状态机

    股票模拟交易_复杂状态机给定一个长度为 N 的数组,数组中的第 i 个数字表示一个给定股票在第 i 天的价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。输入格式第一行包含整数 N,表示数组长度。第二行包含 N 个不超过 10000 的正整数,表示完整的数组。输出格式输出一个整数,表示最大利润。数据范围1≤N≤105输入样例:51

    2022年8月9日
  • SSH深度历险(四) Maven初步学�

    SSH深度历险(四) Maven初步学�

    2021年11月14日
  • Java锁详细介绍(2020最新最全版)

    Java锁详细介绍(2020最新最全版)Java锁分类乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。悲观锁悲观锁是就是悲观思想,即认为写多,遇到并发写

    2022年7月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号