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

每日一题|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)]@cachedef dp(i):if i > 365:return 0elif 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.lryc.cn/news/451009.html

相关文章:

  • oracle 正则 匹配 身份正 手机号
  • 在树莓派上部署开源监控系统 ZoneMinder
  • 2022年6月 Frontier 获得性能第一的论文翻译
  • B2B商城交易解决方案:赋能企业有效重塑采购与销售新生态
  • 初始C语言(五)
  • mysql学习教程,从入门到精通,SQL 修改表(ALTER TABLE 语句)(29)
  • 【网络基础】网络常识快速入门知识清单,看这篇文章就够了
  • OceanBase 关于一号表笔记与ERROR 1060(42S21)问题
  • 【四】Spring Cloud OpenFeign原理分析
  • EDM平台大比拼 用户体验与营销效果双重测评
  • 开卷可扩展自动驾驶(OpenDriveLab)
  • 基于大数据的二手电子产品需求分析及可视化系统
  • SpringBoot——基础配置
  • Android OpenGLES2.0开发(三):绘制一个三角形
  • 数据清洗的重要性与方法
  • AI与大数据的结合:如何从海量数据中提取价值
  • 【漏洞复现】孚盟云oa AjaxSendDingdingMessage接口 存在sql注入漏洞
  • 【VUE】案例:商场会员管理系统
  • IDEA 最新版创建 Sping Boot 项目没有 JDK8 选项的解决方案
  • Unity Asset Store的默认下载位置及更改下载路径的方法
  • ArcEngine实现要素坐标转换:平移、缩放、旋转(批量处理)
  • Redis: 主从复制原理
  • PostgreSQL 向量扩展插件pgvector安装和使用
  • 【论文阅读】基于真实数据感知的模型功能窃取攻击
  • 线程池:线程池的实现 | 日志
  • 海信和TCL雷鸟智能电视的体验
  • 自动化学习3:日志记录及测试报告的生成--自动化框架搭建
  • 【STM32单片机_(HAL库)】4-1【定时器TIM】定时器中断点灯实验
  • Linux编译安装Mysql笔记
  • 在java后端发送HTTPClient请求