zoukankan      html  css  js  c++  java
  • 【leetcode】983. Minimum Cost For Tickets

    题目如下:

    In a country popular for train travel, you have planned some train travelling one year in advance.  The days of the year that you will travel is given as an array days.  Each day is an integer from 1 to 365.

    Train tickets are sold in 3 different ways:

    • a 1-day pass is sold for costs[0] dollars;
    • a 7-day pass is sold for costs[1] dollars;
    • a 30-day pass is sold for costs[2] dollars.

    The passes allow that many days of consecutive travel.  For example, if we get a 7-day pass on day 2, then we can travel for 7 days: day 2, 3, 4, 5, 6, 7, and 8.

    Return the minimum number of dollars you need to travel every day in the given list of days.

    Example 1:

    Input: days = [1,4,6,7,8,20], costs = [2,7,15]
    Output: 11
    Explanation: 
    For example, here is one way to buy passes that lets you travel your travel plan:
    On day 1, you bought a 1-day pass for costs[0] = $2, which covered day 1.
    On day 3, you bought a 7-day pass for costs[1] = $7, which covered days 3, 4, ..., 9.
    On day 20, you bought a 1-day pass for costs[0] = $2, which covered day 20.
    In total you spent $11 and covered all the days of your travel.
    

    Example 2:

    Input: days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]
    Output: 17
    Explanation: 
    For example, here is one way to buy passes that lets you travel your travel plan:
    On day 1, you bought a 30-day pass for costs[2] = $15 which covered days 1, 2, ..., 30.
    On day 31, you bought a 1-day pass for costs[0] = $2 which covered day 31.
    In total you spent $17 and covered all the days of your travel.
    

    Note:

    1. 1 <= days.length <= 365
    2. 1 <= days[i] <= 365
    3. days is in strictly increasing order.
    4. costs.length == 3
    5. 1 <= costs[i] <= 1000

    解题思路:毕竟本人动态规划没有掌握的游刃有余,一时间想不出递推表达式。那就简单粗暴吧,对于任意一个days[i]来说,都有三种买票的方法,买1天,7天和30天,借助DFS的思想依次计算每一种方法的最小值,理论上是有3^365次方种组合,但是计算过程中可以舍去明显不符合条件的组合,因此此方法也能通过。

    代码如下:

    class Solution(object):
        def mincostTickets(self, days, costs):
            """
            :type days: List[int]
            :type costs: List[int]
            :rtype: int
            """
            res = len(days) * costs[0]
            queue = [(0,0)] #(inx,cost_inx,total)
            dp = [366*costs[2]] * (len(days) + 1)
            while len(queue) > 0:
                #print len(queue)
                inx,total = queue.pop(0)
                if inx == len(days):
                    res = min(res,total)
                    continue
                elif total > res:
                    continue
                if dp[inx+1] > total + costs[0]:
                    queue.insert(0,(inx+1, total + costs[0]))
                    dp[inx+1] = total + costs[0]
                import bisect
                next_inx = bisect.bisect_left(days,days[inx]+7)
                if dp[next_inx] > total + costs[1]:
                    queue.insert(0,(next_inx, total + costs[1]))
                next_inx = bisect.bisect_left(days, days[inx] + 30)
                if dp[next_inx] > total + costs[2]:
                    queue.insert(0,(next_inx, total + costs[2]))
            return res
  • 相关阅读:
    .NET技术对软件行业的积极作用
    ADO.NET Entityframework MYSQL provider
    用杯子量水问题通用解法
    详解.NET异步
    说 框架、架构、模式、重构
    谈 三层结构与MVC模式的区别
    面试题一例分享
    LINQ notes2 lambda expression
    毕业论文B.3 DTW算法
    LINQ notes1 intro
  • 原文地址:https://www.cnblogs.com/seyjs/p/10356000.html
Copyright © 2011-2022 走看看