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
  • 相关阅读:
    INSERT VALUES 语句
    SQL Server UNION
    SQL Server自定义函数(Scalarvalued Functions)
    设计一程序(Copy.java),可以实现文件的复制操作
    Eclipse 乱码 解决方案总结(UTF8 GBK)
    Java Collection: List、Set、 Map、 HashMap、 Hashtable、 Vector
    [Linux内核]从开机加电到main函数执行前的过程
    eclipse设置本地Javadoc API路径
    归并排序的递归和非递归实现(C代码)
    解决安装MySQL5.1出现Cannot create windows service for mysql.error:0
  • 原文地址:https://www.cnblogs.com/seyjs/p/10356000.html
Copyright © 2011-2022 走看看