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

143 阅读2分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第10篇文章,最低票价 [无限定的01背包问题(面向时间型)] - 掘金 (juejin.cn)

前言

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

一、最低票价

image.png

二、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 最低票价