【LeetCode】每日一题 2024_10_1 最低票价(记忆化搜索/DP)

前言

每天和你一起刷 LeetCode 每日一题~

大家国庆节快乐呀~

LeetCode 启动!

题目:最低票价

代码与解题思路

今天这道题是经典动态规划,我们定义 dfs(i) 表示从第 1 天到 第 i 天的最小花费,然后使用祖传的:从记忆化搜索 -> 动态规划的思路开始解题

记忆化搜索:

go 复制代码
func mincostTickets(days []int, costs []int) int {
    n := days[len(days)-1]
    needCost := make([]bool, n+1)
    for _, v := range days { // 记录需要通行证的日子
        needCost[v] = true
    }
    // 记忆化
    memo := make([]int, n+1)
    for i := range memo {
        memo[i] = -1
    }
    // i 表示第 1 天到 第 i 天的最小花费
    var dfs func(int) int
    dfs = func(i int) (res int) {
        if i <= 0 { // 不存在的情况就返回 0
            return 0
        }
        // 记忆化操作
        p := &memo[i]
        if *p != -1 {
            return *p
        }
        defer func() {
            *p = res
        }()
        if !needCost[i] { // 如果不需要通行证,那就不需要花费
            res = dfs(i-1)
        } else { // 选出三种花费中最小的一种
            res = min(dfs(i-1)+costs[0], dfs(i-7)+costs[1], dfs(i-30)+costs[2])
        }
        return res
    }
    return dfs(n)
}

记忆化搜索转递推:

go 复制代码
func mincostTickets(days []int, costs []int) int {
    n := days[len(days)-1]
    needCost := make([]bool, n+1)
    for _, v := range days {
        needCost[v] = true
    }
    f := make([]int, n+1)
    for i := 1; i < len(f); i++ {
        if !needCost[i] {
            f[i] = f[i-1]
        } else { 
            f[i] = min(f[i-1]+costs[0], f[max(i-7, 0)]+costs[1], f[max(i-30, 0)]+costs[2])
        }
    }
    return f[n]
}

基本上一比一复刻就可以啦~

有一个需要注意的点,在使用状态转移方程的时候:min(f[i-1]+costs[0], f[max(i-7, 0)]+costs[1], f[max(i-30, 0)]+costs[2]),这里用了 max(i-7, 0) 和 max(i-30, 0),其实就是记忆化搜索中的:

go 复制代码
if i <= 0 {
    return 0
}

如果不存在这种情况,就返回 0,不记入总花费。

视频实况

【【LeetCode】每日一题 2024_10_1 最低票价(记忆化搜索/DP)】 \]( https://www.bilibili.com/video/BV19CxheNETm/?share_source=copy_web\&vd_source=5838aabca6ee756488292563a3936f1d ## 每天进步一点点 > 可以和我刷一辈子的每日一题吗? > > 一题一题,积累起来就是一辈子。![](https://i-blog.csdnimg.cn/direct/12bb0a7f9346423dac8a3d4f320b4830.png)

相关推荐
程序员三藏1 分钟前
如何用Selenium实现自动化?
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
黎阳之光8 分钟前
AI数智筑防线 绿色科技启新篇,如何用硬核技术赋能生态安全双升级
人工智能·科技·算法·安全·数字孪生
2201_7586426411 分钟前
自定义内存检测工具
开发语言·c++·算法
前端摸鱼匠15 分钟前
【AI大模型春招面试题9】大模型预训练的核心目标函数(如MLM、NSP、Causal LM)分别是什么?
人工智能·ai·面试·职场和发展·求职招聘
Westward-sun.16 分钟前
矿物分类实战(一):从异常值到标准化——数据清洗全流程拆解
人工智能·算法·机器学习·数据清洗
D_C_tyu25 分钟前
HTML | 结合Canvas开发具有智能寻路功能的贪吃蛇小游戏实战详解
javascript·算法·游戏·html·bfs
小王不爱笑13230 分钟前
HashMap 扩容全流程
java·数据结构·算法
代码探秘者32 分钟前
【算法篇】4.前缀和
java·数据库·后端·python·算法·spring
计算机安禾32 分钟前
【数据结构与算法】第4篇:算法效率衡量:时间复杂度和空间复杂度
java·c语言·开发语言·数据结构·c++·算法·visual studio
Oueii38 分钟前
嵌入式LinuxC++开发
开发语言·c++·算法