LeetCode——LCP 35. 电动车游城市[困难]——分析及代码(Java)

本文详细分析了LeetCode LCP 35题,即如何使用电动车从起点到终点,通过动态规划和深度优先搜索(DFS)方法解决城市旅行的最短时间问题。文章给出了思路、Java实现代码,并展示了执行时间和内存消耗。
摘要由CSDN通过智能技术生成

LeetCode——LCP 35. 电动车游城市[困难]——分析及代码[Java]

一、题目

小明的电动车电量充满时可行驶距离为 cnt,每行驶 1 单位距离消耗 1 单位电量,且花费 1 单位时间。小明想选择电动车作为代步工具。地图上共有 N 个景点,景点编号为 0 ~ N-1。他将地图信息以 [城市 A 编号,城市 B 编号,两城市间距离] 格式整理在在二维数组 paths,表示城市 A、B 间存在双向通路。初始状态,电动车电量为 0。每个城市都设有充电桩,charge[i] 表示第 i 个城市每充 1 单位电量需要花费的单位时间。请返回小明最少需要花费多少单位时间从起点城市 start 抵达终点城市 end。

示例 1:

输入:paths = [[1,3,3],[3,2,1],[2,1,3],[0,1,4],[3,0,5]], cnt = 6, start = 1, end = 0, charge = [2,10,4,1]

输出:43

解释:最佳路线为:1->3->0。
在城市 1 仅充 3 单位电至城市 3,然后在城市 3 充 5 单位电,行驶至城市 5。
充电用时共 3*10 + 5*1= 35
行驶用时 3 + 5 = 8,此时总用时最短 43。

示例 2:

输入:paths = [[0,4,2],[4,3,5],[3,0,5],[0,1,5],[3,2,4],[1,2,8]], cnt = 8, start = 0, end = 2, charge = [4,1,1,3,2]

输出:38

解释:最佳路线为:0->4->3->2。
城市 0 充电 2 单位,行驶至城市 4 充电 8 单位,行驶至城市 3 充电 1 单位,最终行驶至城市 2。
充电用时 4*2+2*8+3*1 = 27
行驶用时 2+5+4 = 11,总用时最短 38。

提示:

  • 1 <= paths.length <= 200
  • paths[i].length == 3
  • 2 <= charge.length == n <= 100
  • 0 <= path[i][0],path[i][1],start,end < n
  • 1 <= cnt <= 100
  • 1 <= path[i][2] <= cnt
  • 1 <= charge[i] <= 100
  • 题目保证所有城市相互可以到达

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/DFPeFJ
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 动态规划 + DFS

(1)思路

设计一个动态规划数组 time[i][j], 记录到达第 i 个城市剩余 j 电量的最小耗时。
从起点开始,递归遍历可到达的城市,并更新 time 数组,直至下一可到达的目标城市所有充电值的成本均高于当前该城市对应成本,则停止当前支线的遍历。

(2)代码

class Solution {
   
    int[][] len;//城市间距离
    int[] charge;//城市充电价格
    int n;//城市数量
    int cnt;//电动车满电电量
    int[][] time;//到第i个城市剩余j电量耗时
    
    public int electricCarPlan(int[][] paths, int cnt, int start, int end, int[] charge) {
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值