最低票价 [无限定的01背包问题(面向时间型)]

本文探讨了动态规划在解决最低票价问题中的应用,将其与01背包的以第i结尾的最值问题进行比较,着重讲解了一维递推方法的使用。通过实际代码展示了如何利用递推状态f[i]求解旅行最低消费,同时介绍了逻辑思维在算法中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

动规规划和贪心都是训练逻辑思维的好题目,因为其中涉及问题抽象能力,需要将大问题准确的划分为规模更小性质相同的之问题。最低票价有着和01背包的 以第i结尾的最值 特点,但无额外的其他限定,所以从二维递推变成一维递推。

一、最低票价

在这里插入图片描述

二、01背包–以第i结尾的最值

/*
    target:给出了旅行的日期,给出了不同持续期的票价和持续时间,计算最低消费。
    明显可子问题递推,类似于01背包,但没有总和限定,所以二维变一维。

    状态定义:f[i]表示第i天结束的最低消费。
     */
    public int mincostTickets(int[] days, int[] costs) {
        int n = days[days.length - 1];
        int[] f = new int[n + 1]; // f[i]表示第i天结束的最低消费。

        int idx = 0;
        for (int i = days[0]; i <= n;++i ) {
            if(i == days[idx]) {
                int cost0 = i >= 1 ? f[i - 1] + costs[0] : costs[0];
                int cost1 = i >= 7 ? f[i - 7] + costs[1] : costs[1];
                int cost2 = i >= 30 ? f[i - 30] + costs[2] : costs[2];

                f[i] = Math.min(cost0, Math.min(cost1, cost2));

                ++idx;

                continue;
            }
            f[i] = f[i - 1];
        }
        return f[n];
    }

总结

1)动规规划和贪心都是训练逻辑思维的好题目,因为其中涉及问题抽象能力,需要将大问题准确的划分为规模更小性质相同的之问题。

2)01背包第一种类型,因为有其他限定,需要二维递推;今天见识第2种,无额外限定,只需一维递推,但面向时间,划分子问题递推时较于隐式。

参考文献

[1] LeetCode 最低票价

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值