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

每日一题|1928. 规定时间内到达终点的最小花费|动态规划、最小路径

本题需要使用动态规划进行解决。

分析: 求解最小值而且每一次的状态是由上一次的状态推导出来的,用动态规划。

难点:dp数组的定义和更新。

1、dp数组的定义

在时刻t,位置i处,此时的花费可以表示为如下的形式:

 注意到道路是双向的,也就是i和j可以互换位置,所以在后面遍历的时候需要更新两个值。

2、确定更新公式

一次迭代中双向道路更新两个值:

dp[t][i] = min(dp[t][i], dp[t - cost][j] + passFees[i]) -- 从j 到i 需要交i 过路费

dp[t][j] = min(dp[t][j], dp[t - cost][i] + passFees[j]) -- 从i 到j 需要交j 过路费

3、初始化

dp是一个二维数组,col数量是len(passFees),row数量是maxTime + 1(因为t能够达到maxTime)。

更新dp使用min函数,所以初始化dp全部是float('inf'),然后把dp[0][0] = passFees[0]。

4、更新顺序

外层循环遍历t,从1开始到maxTime + 1;

内层循环遍历节点,也就是每一个edge解包出来的节点和时间开销;注意需要两次更新。

class Solution:
    def minCost(self, maxTime: int, edges: List[List[int]], passingFees: List[int]) -> int:
        n = len(passingFees)
        dp = [[float('inf')] * n for _ in range(maxTime + 1)]

        dp[0][0] = passingFees[0]

        for t in range(1, maxTime + 1):
            for i, j, cost in edges:
                if cost <= t:
                    dp[t][i] = min(dp[t][i], dp[t - cost][j] + passingFees[i])
                    dp[t][j] = min(dp[t][j], dp[t - cost][i] + passingFees[j])
        
        ans = min(dp[t][n-1] for t in range(1, maxTime + 1))
        return -1 if ans == float('inf') else ans

 


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

相关文章:

  • 强弱依赖(含示例)
  • ANTLR4 与 flex/bision、lex/yacc 的比较
  • Electron 进程通信
  • Spring MVC系统学习(二)——Spring MVC的核心类和注解
  • 五子棋双人对战项目(5)——对战模块
  • Ubuntu编译fftw3
  • 端口隔离配置的实验
  • ElasticSearch学习笔记(三)Ubuntu 2204 server elasticsearch集群配置
  • JavaCV 实现视频链接截取封面工具
  • 掌控物体运动艺术:图扑 Easing 函数实践应用
  • 【Linux 从基础到进阶】Cassandra数据库安装与调优
  • SpringBoot与微服务:网上租赁系统的现代化构建
  • CSS——文字闪烁效果
  • 机器学习框架
  • 虚拟机三种网络模式详解
  • Android常用C++特性之std::sort
  • 影刀---如何进行自动化操作
  • Kubernetes Ingress:简化外部访问的利器
  • 02Cesium中常用的鼠标事件
  • Python 学习笔记1 - 认识Python