zoukankan      html  css  js  c++  java
  • 最低票价

    此博客链接:

    最低票价

    题目链接:https://leetcode-cn.com/problems/minimum-cost-for-tickets/

    题目

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

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

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

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

    示例 1:

    输入:days = [1,4,6,7,8,20], costs = [2,7,15]
    输出:11
    解释:
    例如,这里有一种购买通行证的方法,可以让你完成你的旅行计划:
    在第 1 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 1 天生效。
    在第 3 天,你花了 costs[1] = $7 买了一张为期 7 天的通行证,它将在第 3, 4, ..., 9 天生效。
    在第 20 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 20 天生效。
    你总共花了 $11,并完成了你计划的每一天旅行。
    示例 2:

    输入:days = [1,2,3,4,5,6,7,8,9,10,30,31], costs = [2,7,15]
    输出:17
    解释:
    例如,这里有一种购买通行证的方法,可以让你完成你的旅行计划:
    在第 1 天,你花了 costs[2] = $15 买了一张为期 30 天的通行证,它将在第 1, 2, ..., 30 天生效。
    在第 31 天,你花了 costs[0] = $2 买了一张为期 1 天的通行证,它将在第 31 天生效。
    你总共花了 $17,并完成了你计划的每一天旅行。
     

    提示:

    1 <= days.length <= 365
    1 <= days[i] <= 365
    days 按顺序严格递增
    costs.length == 3
    1 <= costs[i] <= 1000

    题解

     使用动态规划,dp[]保存当前最小的花费,初始值是0,状态转移方程是取最小的花费:

     dp[i]=Math.min(dp[Math.max(0,i-1)]+costs[0],
                      Math.min(dp[Math.max(0,i-7)]+costs[1],
                      dp[Math.max(0,i-30)]+costs[2]));
    这里为了方便,把dp[]的长度定义成旅游的最后一天的长度,这样dp[]的长度和旅游时间是一致的,找最小的花费时,可以判断是否是旅游的天数,如果是,则找最小的花费,如果不是,则当前天地额旅游花费和前一天的额旅游花费是一样的。

    代码

    class Solution {
        public int mincostTickets(int[] days, int[] costs) {
              int len=days.length;
              int []dp=new int [days[len-1]+1];
              int index=0;
              for(int i=1;i<=days[len-1];i++)
              {
                  if(i!=days[index])
                  {
                      dp[i]=dp[i-1];
                  }
                  else{
                    //   System.out.println(i);
                      dp[i]=Math.min(dp[Math.max(0,i-1)]+costs[0],
                      Math.min(dp[Math.max(0,i-7)]+costs[1],
                      dp[Math.max(0,i-30)]+costs[2]));
                      index=index+1;
                        //   System.out.println(dp[i]);
                  }
              }
              return dp[days[len-1]];
        }
    }

    结果

    出来混总是要还的
  • 相关阅读:
    1052 Linked List Sorting (25 分)
    1051 Pop Sequence (25 分)
    1050 String Subtraction (20 分)
    1049 Counting Ones (30 分)
    1048 Find Coins (25 分)
    1047 Student List for Course (25 分)
    1046 Shortest Distance (20 分)
    1045 Favorite Color Stripe (30 分)
    1044 Shopping in Mars (25 分)
    1055 The World's Richest (25 分)
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/14549225.html
Copyright © 2011-2022 走看看