【算法】记忆化搜索

news/2024/12/28 8:53:51/文章来源:https://www.cnblogs.com/DLShark/p/18523541

[!TIP]

一种剪枝算法,优化运算效率,减少冗余计算

基本内容

  • 入门例子 [P1028 [NOIP2001 普及组] 数的计算]([P1028 NOIP2001 普及组] 数的计算 - 洛谷 | 计算机科学教育新生态)

题目要求:输入n,输出一共可以构造多少个数列,要求数列的第 i不能超过第i-1个数的一半

示例:输入6,只能输出 [6], [6, 1], [6, 2], [6, 3], [6, 2, 1], [6, 3, 1] 一共六种

  • 传统思路,深度优先搜索算法,可以发现大部分案例都 TLE(超时)了
n = int(input())
ans = 0
def f(x):global ansans += 1for i in range(1, int(x/2)+1):f(i)f(n)
print(ans)

  • 超时分析:存在着重复计算的数列重复子问题,以输入8为例,当我们计算出[8, 2, 1]时就知道了当输入为2时只有俩个可以满足的序列,以此类推,当我们以32为输入,计算到[36, 16, 8 ....] 得知子树8共有 10 种数列时,即可直接计算 [36, 8] 共有11种满足的数列。

  • 记忆化搜索:额外开辟一个数组空间 cache 存储计算过的值
n = int(input())
cache = [-1] * (n+1)
def f(x):if cache[x] != -1: # cache 不为-1表示已经计算过return cache[x]ans = 1 # 每一个数字都可以表示单独为一个数列for i in range(1, int(x/2)+1):ans += f(i)cache[x] = ansreturn ansprint(f(n))

题目

  1. Leetcode 638. 大礼包

本来想用贪心算法去做,行不通,还是需要遍历每一种情况

class Solution:def shoppingOffers(self, price: List[int], special: List[List[int]], needs: List[int]) -> int:cache = {}def dfs(needs: Tuple[int]) -> int:if needs in cache: # 若need被计算过则返回need所需的最小花费return cache[needs]min_cost = 0 # 不用礼包的低消for i in range(len(price)):min_cost += (needs[i] * price[i])for offer in special: # 因为礼包可以无限次使用,每次都需要遍历每一个礼包new_needs = []for i in range(len(needs)):if needs[i] < offer[i]:  # 如果大礼包的物品超出需求,跳过breaknew_needs.append(needs[i] - offer[i])else: # 表示for循环没有被break,计算当前使用该礼包是否可以得到最小值min_cost = min(min_cost, dfs(tuple(new_needs)) + offer[-1])cache[needs] = min_costreturn min_costreturn dfs(tuple(needs))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826212.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

『模拟赛』NOIP2024模拟1

『模拟赛记录』NOIP2024模拟1Rank 有点可惜,A. 玩游戏 绝妙贪心题。感觉这种能产生很多假做法且都可 hack 的贪心都是好题。 赛时不知道为什么犯唐没交一开始的暴力贪心。 考虑双指针,设左右指针分别为 \(l,r\)。主要思路是实时维护当前两个指针向两边最近的一个区间和不为正…

2024-2025-1 20241312《计算机基础与程序设计》第6周学习总结

这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第六周作业)这个作业的目标 Polya如何解决问题 简单类型与组合类型 复合数据结构 查找与排序算法 算法复杂度 递…

工程师和科学家的高等数学及python实例:2三角函数 II

2 三角函数 II 学完本章内容后,你应该能够 ● 讨论反三角函数的图形 ● 讨论倒数函数的图形 ● 评估正弦、余弦和正切函数的变换 2.1 引言 本章将继续讨论三角函数,研究上一章中涉及的三个三角函数的倒数和反三角函数。本章还将讨论这些函数的变换。 2.2 三角函数的倒数 正弦…

搭建主从DNS服务器实现域名正逆向解析

1.前置工作:关闭防火墙及selinux 2.安装软件:yum install -y bind 3.本文仅搭建本地DNS实现逆向域名解析 1)建议复制逆向解析模板再进行修改 模板路径:/etc/named.rfc1912.zones 2)进入主配置文件并添加逆向配置文件 vim /etc/named.conf 注意:区域名称中IP地址反向书写,…

2024-2025-1 20241407《计算机基础与程序设计》第六周学习总结

这个作业属于哪个课程 [2024-2025-1计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)这个作业要求在哪里 2024-2025-1计算机基础与程序设计第六周作业这个作业的目标 学习Polya如何解决问题,简单类型与组合类型,复合数据结构,查找与排序算法…

Me-and-My-Girlfriend-1靶机渗透 (Vulnhub内网渗透)

一、Me-and-My-Girlfriend-1: 1、渗透目标: Description: This VM tells us that there are a couple of lovers namely Alice and Bob, where the couple was originally very romantic, but since Alice worked at a private company, "Ceban Corp", something …

pc大屏适配

在文件utils里配置 const baseSize = 12 //设置rem函数 function setRem() {//页面宽度相对于设计图宽的缩放比例,根据需要修改 1920(设计稿宽度)const scale = document.documentElement.clientWidth / 1920;// 设置页面根节点字体大小(match.min(scale,2)"指最高放大比…

高级语言程序设计第五次个人作业

2024高级语言程序设计:https://edu.cnblogs.com/campus/fzu/2024C 高级语言程序设计课程第五次个人作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13298 学号:102400111 姓名:蔡伟仡 8.11.18.11.28.11.38.11.48.11.58.11.68.11.78.11.89.11.19.11.29.11.39.11.49.11…

数据采集与融合技术实践作业三

数据采集与融合技术实践作业三 gitee链接:https://gitee.com/wei-yuxuan6/myproject/tree/master/作业3 作业① Scrapy爬取图片实验要求:指定一个网站,爬取这个网站中的所有的所有图片,例如:中国气象网(http://www.weather.com.cn)。使用scrapy框架分别实现单线程和多线…

固态移动硬盘不识别数据恢复

当固态移动硬盘不被识别时,数据恢复成为一个关键问题。以下是一些有效的数据恢复方法: 一、检查连接与驱动程序 检查连接:首先确认固态移动硬盘的连接是否正确,包括SATA接口、电源连接(如果适用)以及USB线或其他转接线是否损坏或松动。对于外置硬盘,确保连接线和转接器没…

OpenGL编程指南(原书第9版)

百度网盘下载地址: https://pan.baidu.com/s/1ATLvMOcW1jwBXSygOg3xUA 关注微信公众号 回复 1100 获取提取码:

30 万维网

互联网是传输数据的管道, 万维网是互联网上的上一层,是一个程序,传输最多数据的程序,可以用浏览器访问万维网 超文本,超链接 每个网页有唯一地址,这个地址叫统一资源定位器url 网页有书写标准hyml等等 搜索引擎: 1爬虫,跟着链接到处跑,看到新连接就加进自己的列表 2不…