LeetCode--983. 最低票价

动态规划的思想。我们不仅要从开始往后找最优解。像这种能晚发生就晚发生的可以逆向,从后往前找。

在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。

火车票有三种不同的销售方式:

一张为期一天的通行证售价为 costs[0] 美元;
一张为期七天的通行证售价为 costs[1] 美元;
一张为期三十天的通行证售价为 costs[2] 美元。
通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第 3 天、第 4 天、第 5 天、第 6 天、第 7 天和第 8 天。

返回你想要完成在给定的列表 days 中列出的每一天的旅行所需要的最低消费。

看了题解的提示有了思路:从后往前,如果从第i天开始到最后,那么我最便宜需要多少钱?而第i天如果没有要出行,则不需要买;需要出行则有三种方案:a.买1天的,再加上后一天到最后的最便宜价格;b.买7天的,再加上7天后的那天到最后一天最便宜的价格;c.买30天的,再加上30天后的那天到最后一天最便宜的价格。

    public int mincostTickets(int[] days, int[] costs) {
        int[] daysMoney = new int[365];//用来记录第i天到最后一天最少花费多少钱
        int yearNum = 365;
        int daysIndex = days.length-1;
        for(int i = yearNum-1; i >= 0; --i){
            if(days[daysIndex] == i + 1){//分四种情况:最后一天,最后7天内,最后30天内,此范围以外
                if(days[daysIndex] >= yearNum){
                    daysMoney[i] = costs[0];
                    daysIndex--;
                    if(daysIndex < 0)
                        return daysMoney[i];
                    continue;
                }
                if( days[daysIndex] + 6 >= yearNum){
                    daysMoney[i] = Math.min(costs[1], costs[0] + daysMoney[i+1]);
                    daysIndex--;
                    if(daysIndex < 0)
                        return daysMoney[i];
                    continue;
                }
                if(days[daysIndex] + 29 >= yearNum){
                    daysMoney[i] = Math.min(costs[0] + daysMoney[i+1], costs[1] + daysMoney[i+7]);
                    daysMoney[i] = Math.min(daysMoney[i], costs[2]);
                    daysIndex--;
                    if(daysIndex < 0)
                        return daysMoney[i];
                    continue;
                }
                daysMoney[i] = Math.min(costs[0] + daysMoney[i+1], costs[1] + daysMoney[i+7]);
                daysMoney[i] = Math.min(daysMoney[i], costs[2] + daysMoney[i + 30]);
                daysIndex--;
                if(daysIndex < 0)
                    return daysMoney[i];
            }else {
                if(i == yearNum-1)
                    daysMoney[i] = 0;
                else
                    daysMoney[i] = daysMoney[i+1];
            }
        }
        return daysMoney[0];
    }

猜你喜欢

转载自blog.csdn.net/lfanchenyu/article/details/105962026