当前位置: 首页 > article >正文

每日一题|983. 最低票价|动态规划、记忆化递归

本题求解最小值,思路是动态规划,但是遇到的问题是:动态规划更新的顺序和步长,以及可能存在的递归溢出问题。

1、确定dp数组含义

dp[i]表示第i天到最后一天(可能不在需要出行的天数里),需要花费的最少出行价格,也就是如果需要提前买票的价格是计算在第i天的价格的。

2、确定递推公式

对于当前的dp[i],有3种可选的方案:1天、7天、30天,分别代表了更新后的dp位置。

dp[i] = min(dp[i + 1] + cost[0], dp[i + 7] + cost[1], dp[i + 30] + cost[2]) 

3、确定遍历顺序

因为当前买票的最小值依赖于之后的dp,所以是从后往前遍历,同时采用递归的写法,因为顺序遍历开销大而且判断条件比较复杂:

3.1确定终止条件:超出了365天的限制

if i > 365: return 0

3.2如果在days内的更新

return dp(i) = min(dp(i + 1) + cost[0], dp(i + 7) + cost[1], dp(i + 30) + cost[2]) 

3.3如果不在days内的更新

return dp(i+1)

4、确定初始化

初始化dp数组为0即可,长度为366,和days的索引保持一致。

class Solution:
    def mincostTickets(self, days: List[int], costs: List[int]) -> int:
        duration = [1, 7, 30]
        dp = [0 for _ in range(366)]
        
        @cache
        def dp(i):
            if i > 365:
                return 0
            elif i in days:
                return min(dp(i + d) + c for c, d in zip(costs, duration))
            else:
                return dp(i+1)

        return dp(1)

这里使用了Python3的@cache装饰特性,用来储存递归的新数据节省时间开销。

对于python2、java可以使用memo = {}记忆化字典来储存每一个dp,如果是新的就储存,见过的直接返回。


http://www.kler.cn/news/329459.html

相关文章:

  • OpenCV视频I/O(4)视频采集类VideoCapture之获取异常处理模式函数getExceptionMode()的使用
  • 【JavaEE初阶】深入理解多线程阻塞队列的原理,如何实现生产者-消费者模型,以及服务器崩掉原因!!!
  • 2024年7月大众点评全国美食店铺基础信息分析
  • C++初阶:STL详解(十)——priority_queue的介绍,使用以及模拟实现
  • 【C++】第一节:C++入门
  • Spring Boot与足球青训后台系统的协同
  • Golang | Leetcode Golang题解之第442题数组中重复的数据
  • Python知识点:使用Azure IoT Edge与Python进行边缘计算
  • SpringBoot-MybatisPlus项目中,在控制台查看sql执行日志的方法
  • Git 与标签管理
  • 人工智能领域机器学习与深度学习的区别
  • 初始爬虫10
  • Django学习笔记三:QuerySet使用详解
  • Rust赋能前端:为WebAssembly 瘦身
  • 8.使用 VSCode 过程中的英语积累 - Help 菜单(每一次重点积累 5 个单词)
  • 第1 章 第一节:基础语法
  • coco(json)、yolo(txt)、voc(xml)标注格式的相互转换
  • 每日练习 4332: 数学大佬带带我啊
  • 【区别】git restore --staged <文件> 和 git reset HEAD <文件> 都可以用于取消已暂存的文件
  • Windows安装启动apache httpd 2.4 web服务器
  • 使用OpenCV进行图像处理:实用函数开发
  • ip的类型有多少种?我想做大数据需要使用哪一种
  • c++进阶之多态讲解
  • 设计模式面试题
  • 算法宝典——二分查找算法
  • RabbitMQ的相关题
  • 每日一练:杨辉三角
  • 32、Qt读写csv文件
  • 压力测试指南-压力测试基础入门
  • HashMap为什么线程不安全?如何实现线程安全