首页 > 编程语言 >【算法】记忆化搜索

【算法】记忆化搜索

时间:2024-11-03 15:57:41浏览次数:2  
标签:needs min int cache 算法 cost 记忆 ans 搜索

[!TIP]

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

基本内容

题目要求:输入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 ans
    ans += 1
    for 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] = ans
    return ans

print(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]:  # 如果大礼包的物品超出需求,跳过
                        break
                    new_needs.append(needs[i] - offer[i])
                else: # 表示for循环没有被break,计算当前使用该礼包是否可以得到最小值
                    min_cost = min(min_cost, dfs(tuple(new_needs)) + offer[-1])
                    
            cache[needs] = min_cost
            return min_cost
        
        return dfs(tuple(needs))

标签:needs,min,int,cache,算法,cost,记忆,ans,搜索
From: https://www.cnblogs.com/DLShark/p/18523541

相关文章

  • 机器学习算法在金融信贷风控模型中的应用毕业论文【附数据】
    ......
  • 【笔记/模板】A*算法
    A*算法定义A*搜索算法(\(\text{A*searchalgorithm}\))是一种在图形平面上,对于有多个节点的路径求出最低通过成本的算法。它属于图遍历(英文:\(\text{Graphtraversal}\))和最佳优先搜索算法(英文:\(\text{Best-firstsearch}\)),亦是BFS的优化,用到了启发式搜索的思维。启发式搜索(......
  • 【Python】深入解析Python中的多重继承与MRO:原理、C3线性化算法与super()用法
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界Python的多重继承机制允许一个类从多个父类中继承属性和方法,这带来了极大的灵活性和复用性,但也引发了“菱形继承”问题,即多条继承路径导致同一属性或方法重复调用。为了解决此问题,Python引入了MRO(方法解析顺序)规......
  • 【综合算法学习】(第十五篇)
    目录图像渲染(medium)题目解析讲解算法原理编写代码岛屿数量(medium)题目解析讲解算法原理编写代码图像渲染(medium)题目解析1.题目链接:.-力扣(LeetCode)2.题目描述有⼀幅以mxn的⼆维整数数组表⽰的图画image,其中image[i][j]表⽰该图画的像素值⼤⼩。你也被给予三......
  • 蓝桥算法
    1.https://www.lanqiao.cn/problems/19954/learning/?contest_id=214这道题用快速幂直接秒,而快速幂就是求一个数的次方很大的时候,我们可以把指数分解为二进制的形式,再有a的b*c次方等于a的b次方乘以a的c次方,在用一个数存储一下即可。代码如下:defqui(x,y):res=1whiley:if......
  • 【算法-选择排序】挑挑拣拣,排出顺序——选择排序入门
    什么是选择排序?选择排序是一种比较简单直接的排序方式。想象你在打散一副牌,想按照大小顺序从小到大排列这些牌。你会怎么做?可能会先找出最小的那张,放在最前面,然后在剩下的牌里找第二小的,依次类推,这就是选择排序的基本思路!在程序中,选择排序的操作流程也类似:它逐步将未排序......
  • 《AI 算法的突破与挑战:探寻人工智能的核心驱动力》
    在当今科技飞速发展的时代,AI算法无疑是人工智能领域的核心驱动力,它的不断演进和突破正在重塑我们的世界。从简单的代码到如今令人惊叹的“智能大脑”,AI算法经历了漫长的发展历程,取得了诸多令人瞩目的成就,但同时也面临着一系列的挑战。一、AI算法的辉煌成就精度超越......
  • 布谷鸟优化算法:原理、案例与代码实现
    一、引言在优化算法的领域中,布谷鸟优化算法(CuckooSearchAlgorithm)以其独特的原理和高效的性能受到了广泛关注。它模拟了布谷鸟的繁殖行为和Levy飞行模式,为解决复杂的优化问题提供了一种新颖的途径。二、布谷鸟优化算法原理(一)布谷鸟繁殖行为模拟在自然界中,布谷鸟将......
  • 算法-图论-拓扑排序
    1.拓扑排序(卡码网117)fromcollectionsimportdeque,defaultdictdefmain():num_node,num_edge=map(int,input().split())inDegrees=[0for_inrange(num_node)]edges=defaultdict(list)for_inrange(num_edge):source,target=......
  • floyed算法模板
    #include<bits/stdc++.h>#include<vector>usingnamespacestd;intlj[1010][1010];//邻接矩阵//可以换成链式前向星之类的巴拉巴拉,这里用邻接矩阵演示比较清楚intn,m;intflyd[1001][1001];intmain(){ cin>>n>>m; for(inti=1;i<=m;i++){ intu,v,w; cin>>u>>......