Hex-a-bonacci ————记忆化搜索

【25届秋招备战C++】算法篇-记忆化搜索(Memoization) 一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。 阅读详情

Given a code (not optimized), and necessary inputs, you have to find the output of the code for the inputs. The code is as follows:

int a, b, c, d, e, f;
int fn( int n ) {
    if( n == 0 ) return a;
    if( n == 1 ) return b;
    if( n == 2 ) return c;
    if( n == 3 ) return d;
    if( n == 4 ) return e;
    if( n == 5 ) return f;
    return( fn(n-1) + fn(n-2) + fn(n-3) + fn(n-4) + fn(n-5) + fn(n-6) );
}
int main() {
    int n, caseno = 0, cases;
    scanf("%d", &cases);
    while( cases-- ) {
        scanf("%d %d %d %d %d %d %d", &a, &b, &c, &d, &e, &f, &n);
        printf("Case %d: %d\n", ++caseno, fn(n) % 10000007);
    }
    return 0;
}

Input
Input starts with an integer T (≤ 100), denoting the number of test cases.

Each case contains seven integers, a, b, c, d, e, f and n. All integers will be non-negative and 0 ≤ n ≤ 10000 and the each of the others will be fit into a 32-bit integer.

Output
For each case, print the output of the given code. The given code may have integer overflow problem in the compiler, so be careful.

Sample Input
5
0 1 2 3 4 5 20
3 2 1 5 0 1 9
4 12 9 4 5 6 15
9 8 7 6 5 4 3
3 4 3 2 54 5 4
Sample Output
Case 1: 216339
Case 2: 79
Case 3: 16636
Case 4: 6
Case 5: 54


题意:

  • 根据这段给定的代码写程序
  • 因为代码是直接递归,所以在500ms500ms内很难通过所有的测试样例的,复杂度是O(n6)O(n6)
  • 所以我们得去掉重复计算,想到用递推或者记忆化搜索

记忆化搜素:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+7;
const int mod=10000007;
int f[MAXN];

int fn(int n)
{
    if(n<6)    return f[n];
    if(f[n-1])  return f[n]=f[n-1]%mod+f[n-2]%mod+f[n-3]%mod+f[n-4]%mod+f[n-5]%mod+f[n-6]%mod;
    return  f[n]=fn(n-1)%mod+fn(n-2)%mod+fn(n-3)%mod+fn(n-4)%mod+fn(n-5)%mod+fn(n-6)%mod;
}

int main()
{
    int t,n;
    scanf("%d",&t);
    int T=t;
    while(t--)
    {
        memset(f,0,sizeof(f));
        scanf("%d %d %d %d %d %d %d",&f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&n);
        printf("Case %d: %d\n",T-t,fn(n)%mod);
    }
    return 0;
}




递推:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+7;
const int mod=10000007;
int f[MAXN];
int main()
{
    int t,n;
    scanf("%d",&t);
    int T=t;
    while(t--)
    {
        scanf("%d %d %d %d %d %d %d",&f[0],&f[1],&f[2],&f[3],&f[4],&f[5],&n);
        for(int i=6;i<=n;i++)
            f[i]=f[i-1]%mod+f[i-2]%mod+f[i-3]%mod+f[i-4]%mod+f[i-5]%mod+f[i-6]%mod;
        printf("Case %d: %d\n",T-t,f[n]%mod);
    }
    return 0;
}


递推还是比较快的,4ms
递归的话用了132ms

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

相关推荐

C++实现记忆搜索算法

1、记忆搜索算法:        给n*n地图,老鼠初始位置在(0,0),它每次行走要么横着走要么竖着走,每次最多可以走出k个单位长度,且落脚点的权值必须比上一个落脚点的权值大,求最终可以获得的最大权值  2、思路      每次最多m步,记录四个方向的下一次走法可以获得的权值总和,只能直走。m种情况选最大。 3、代码实现 #include&lt;iostream&gt; #inclu...

程序猿老樊的博客 2194

C++记忆化搜索详解

具体实现时,可以根据问题的特点设计合适的数据结构和逻辑,将已计算过的结果保存起来,以便后续的计算中进行查找和复用。在传统的递归解法中,当函数需要多次调用自身时,可能会出现重复计算相同的子问题。这种情况下,记忆化搜索通过保存已计算过的结果,避免重复计算,从而提高程序的执行效率。在这段代码中,我们定义了一个全局数组f来进行记忆化搜索,在递归函数fib中如果第i项的值已经被计算过了就直接调用,可以大大提高代码的运行速度。C++中的记忆化搜索(Memoization)是一种优化技术,用于减少重复计算的开销。

hhh_bzh的博客 1605

C++记忆化搜索

记忆化搜索(Memoization Search):是一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。 记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果时,它首先检查是否已经计算过该问题。如果已经计算过,则直接返回已经存储的结果;否则,计算该问题,并将结果存储下来以备将来使用。

闻缺陷则喜何志丹 2524

9.5记忆化搜索

记忆化搜索通过缓存子问题结果,显著提升递归算法效率,适用于具有重叠子问题的场景。在C++中灵活运用数组或哈希表存储状态,能有效解决复杂问题如动态规划、组合优化等。

赵鑫亿的博客 985

记忆化搜索--动态规划《滑雪》代码

记忆化搜索--动态规划入门《滑雪》AC代码 自己写

STM8+NRF24l01+接收程序

STM8+NRF24l01+接收程序,利用STM8最小系统实现NRF24L01的通讯,是学习的小案例

SCAU ACM 校队寒训题A A - Hex-a-bonacci 【记忆化搜索】

题目给的暴力搜索肯定是超时代码,因为每次递归都会用重复运算。 那么如何解决重复运算呢?那就把算过的值存起来就好啦。 这里用迭代的方法写了,递归也一样。 注意每一步都要取余 #include <stdio.h> #include <string.h> #include <limits.h> int a, b, c, d, e, f; int dp[1000...

待到山花烂漫时 405

基于mediapipe的动作捕捉和人物模型的驱动

我实习做这个的时候,当时也找了很多资料,但很多资料都没有讲透,下面我就总结一下自己结合看代码后的感悟,还有一些我认为很重要的点。

qq_58484580的博客 7710

Light OJ 1006 Hex-a-bonacci(记忆化搜索优化)

Given a code (not optimized), and necessary inputs, you have to find the output of the code for the inputs. The code is as follows: int a, b, c, d, e, f;int fn( int n ) {    if( n == 0 ) return a;   ...

mengxianglong123的博客 230

通义千问语言模型Qwen2.5架构详解

此外,将基于API的模型 Qwen-Plus 与领先的专有和开源模型进行了对比,包括 GPT4-o、Claude-3.5-Sonnet、Llama-3.1-405B和DeepSeek-V2.5。Qwen2.5-Math-72B-Instruct的整体性能超越了Qwen2-Math-72B-Instruct和GPT4-o,甚至是非常小的专业模型如 Qwen2.5-Math-1.5B-Instruct也能在与大型语言模型的竞争中取得高度竞争力的表现。近来也出现了明显的转向小型语言模型(SLMs)的趋势。

搏博的专栏 1万+

DPABI实战:手把手教你处理小鼠静息态fMRI数据(从Voxel Size到SPM完整流程)

本文详细介绍了使用DPABI处理小鼠静息态fMRI数据的完整流程,从Voxel Size调整到SPM分析,涵盖预处理、质量控制和可视化等关键步骤。针对小鼠数据特有的低分辨率和信噪比问题,提供了实战建议和避坑指南,帮助研究人员高效完成数据分析。

weixin_42663213的博客 478

LightOJ - 1006 Hex-a-bonacci

数据量很小 随便写都行 递推: #include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;cstdio&gt; using namespace std; #define se second #define fi first #define ll long long #define pb push_back #defi...

Yishui_lovely 238

不会写GLSL?用Cesium 1.120 + Heatmap.js 2.0.5也能搞定动态洪水模拟(附完整源码)

本文介绍了一种无需GLSL编程的3D洪水动态模拟方案,结合Cesium 1.120和Heatmap.js 2.0.5实现高效可视化。通过数据层、可视化层和集成层的技术降级方案,开发者可以快速构建专业级洪水演进效果,适用于应急管理、水利工程等场景。文章包含完整源码和性能优化技巧。

weixin_30329623的博客 523

【C++】搜索系列——记忆化搜索

记忆化搜索是一种用于优化递归算法的技术,特别适用于解决具有重叠子问题的问题。通过存储已经计算过的子问题结果,避免重复计算,从而显著提升效率。

Yinrtyu_的博客 727

KEPServerEX作为MQTT客户端

打开软件: 测试没有连接上MQTT代理。

低码开发 1681

自动驾驶感知新方案:YOLOv13多模态(RGB+LiDAR+热成像)融合实战

YOLOv13的RGB+LiDAR+热成像多模态融合方案,解决了自动驾驶感知的鲁棒性问题,通过跨模态特征互补和注意力融合,实现了复杂场景下的高精度检测。本文从架构设计、数据预处理、核心模块实现到车载部署,完成了全流程实战。动态模态权重:根据场景自动调整各模态的权重(如黑夜场景提升热成像权重);端到端3D检测:直接从原始点云与图像进行3D检测,减少预处理步骤;轻量化优化:针对车载设备进一步剪枝量化,提升推理速度。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 535

C++知识点总结(40):深度优先搜索(DFS)的记忆化搜索

但是,由于苹果掉到地上会摔烂,贝茜必须在半空中接住苹果,贝茜吃东西很快,它接到苹果后仅用几秒钟就能吃完。滑雪为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。在某个问题中,可能会存在一些子问题的解在后续计算中被重复使用,而记忆化搜索通过记录已经计算得到的子问题解,以便后续直接使用,避免重复计算,从而提高算法效率。分钟),因此当苹果掉落时,它必定站在两棵树其中的一棵下面。现给出每分钟掉落苹果的树的编号,要求判断贝茜能够接住的最多苹果数。,使用记忆化搜索的方法,将。

joe_g12345的博客 1234

把 SAP Fiori Launchpad 配置文件放进 MIME Repository:从上传、缓存控制到可访问路径的完整实践

文章摘要: 在 SAP Fiori 项目中,Launchpad 配置文件的部署是关键挑战,核心在于通过 MIME Repository 而非直接修改标准文件来实现稳定配置。与 BSP Repository 相比,MIME Repository 支持显式设置客户端缓存时间(如 SAP 推荐的 7 天),适合生产环境治理。配置文件需为 JSON 格式,部署时需确保路径可访问(通过 ICF node 和 external alias),并注意语法错误会导致静默失效。实操步骤包括:在 SE80 中创建专用目录、设置

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 93

c++算法学习6——记忆化搜索

记忆化搜索算法是为优化递归运算而产生的,因为简单的递归实现通常存在严重的效率问题。以斐波那契数列为例,计算fib(50)需要约1.5万亿次递归调用!这种使得简单递归在实际应用中几乎无法使用。记忆化搜索正是为了解决这个问题而诞生的优化技术。

overload100的博客 1082

【Godot】【工程】中文字体与多语言(缺字/体积/打包:一次性配置到位)

本文介绍了Godot游戏开发中的中文字体配置与多语言支持方案。主要内容包括:1)中文字体的全局与局部设置;2)使用子集化技术减小字体体积;3)多语言资源管理及翻译系统实现;4)语言切换机制与控件刷新方法;5)字体回退策略优化显示效果;6)打包优化建议。文章提供了从字体导入到多语言实现的完整解决方案,帮助开发者系统性解决中文显示和多语言支持问题,同时优化资源体积和性能表现。配套案例可供学习参考。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 598

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

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

int n=10的sizeof 为什么是四_妈妈问我为什么跪着学搜索算法

前言:搜索算法在算法竞赛中可谓是万金油算法,频频失意的张三学习了搜索算法后,一时间功力大增。作者本着学习的心态,逼着张三交出了搜索算法秘籍......全文共7500字左右,如果看不完建议收藏,本文涉及代码尽量少用语言特性,只要学过C/C++或Java就能看懂!暴力搜索算法和思想暴力搜索通常会将所有可能结果都列举出来,从中寻找答案,性能不会很高。但是,能将暴力算法写出来通常就意味着你已经把题目做出来...

weixin_39895481的博客 479

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ 动态规划 记忆化搜索 滑雪

C++ 动态规划 记忆化搜索 滑雪

fucheng的博客 883

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

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

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

斐波那契数列(记忆化搜索

题目 1 1 2 3 5 8 13 21 34 55 第n项等于(n-1)+(n-2)。 代码 #include<bits/stdc++.h> using namespace std; int fib[1000005]; int dfs(int n){ if(fib[n]) return fib[n]; if(n==1||n==2) fib[n]=1; else fi...

weixin_46396354的博客 813

c++ dfs搜索算法——记忆化搜索

本文介绍了记忆化搜索的核心思想和实现方法,并通过三个例题展示其应用。记忆化搜索通过保存重复计算结果来优化递归算法,关键在于使用数组或map存储状态。首先以斐波那契数列为例,对比普通递归和记忆化搜索的时间效率差异。随后解析蓝桥云课"混境之地5"问题,展示如何将暴力DFS转化为记忆化搜索。最后以"地宫取宝"为例,说明记忆化搜索在复杂路径问题中的应用。文章强调记忆化搜索能显著降低时间复杂度,但需确保重复计算结果相同。每个例题都提供完整代码实现,并解释关键步骤和注意事项。

qizhiburce的博客 435

C++记忆化搜索解析

本文深入解析了C++记忆化搜索技术,结合DFS与动态规划的优势,通过缓存已计算子问题来优化时间复杂度。文章首先阐释了记忆化搜索的核心原理(重叠子问题和最优子结构),并对比了记忆化搜索与传统DP的差异。随后提供了通用的实现框架模板,强调缓存初始化和状态转移的关键步骤。最后通过斐波那契数列(一维)和网格路径问题(二维)两个经典例题,展示了记忆化搜索的具体应用与代码实现。全文系统性地讲解了从原理到实战的完整知识链,帮助读者掌握这一高效算法技术。

互联网改遍了世界。 791

C++ 记忆化搜索

他的基本思想是利用缓存来存储已经计算过的子问题的结果,以便在后续计算过程中直接获取,避免重复计算。2 编码方便,相比于动态规划来说,不需要关注子问题的枚举顺序问题,也不用管数组的下标越界问题,只需要按照深度优先搜索的思路,把代码框架写好,再加入记忆化部分的代码即可。5 递归计算结果并返回:这一步就是深度优先搜索的递归过程,也是递归子问题取最优解的过程,根据状态转移方程来执行递归调用。2 合法性剪枝:因为在递归计算的时候,我们必须保证输入参数的合法性,所以这一步是必要的,比如坐标之类负数的判断。

qq_43355454的博客 344
上一篇: Common Subsequence ————LCS
下一篇: FatMouse and Cheese ————记忆化搜索
陶鸿杰
博客等级 码龄9年 93粉丝 298原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值