算法: 门票最低成本983. Minimum Cost For Tickets

算法: 门票最低成本983. Minimum Cost For Tickets

You have planned some train traveling one year in advance. The days of the year in which you will travel are given as an integer array days. Each day is an integer from 1 to 365.

Train tickets are sold in three different ways:

  • a 1-day pass is sold for costs[0] dollars,
  • a 7-day pass is sold for costs[1] dollars, and
  • 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: 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.

Constraints:

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

动态规划解法

dp[i] 表示最多第 i 天的门票最低费用。dp 数组的大小取决于最后一个旅行日,因此我们不需要数组长度为 365。

我们确实需要一个布尔数组来标记旅行天数,原因是如果它不是旅行日,我们就不需要票。但是,如果是旅行日,我们会考虑三种情况(具有三种类型的票证):

  1. 如果第 i 天的 1 天票,dp[i] = dp[i - 1] + cost[0]
  2. 如果第 i 天结束的 7 天票,dp[i] = min(dp[i - 7] , dp[i - 6] ... dp[i - 1]) + cost[1]
  3. 如果 30 天票在第 i 天结束,dp[i] = min(dp[i - 30], dp[i] - 29] ... dp[i - 1]) + cost[2]

但是由于 dp 数组的值在增加,因此:

  • 对于在第 i 天结束的 7 天票,dp[i] = dp[i - 7] + cost[1]
  • 对于在第 i 天结束的 30 天票, dp[i] = dp[i - 30] + cost[2]
 public int mincostTickets(int[] days, int[] costs) {
    // length up to the last travel + 1 day is good enough (no need for 365)
    int lastDay = days[days.length - 1]; 
    // dp[i] means up to i-th day the minimum cost of the tickets
    int[] dp = new int[lastDay + 1]; 
    boolean[] isTravelDays = new boolean[lastDay + 1];
    // mark the travel days
    for(int day : days) isTravelDays[day] = true;
    
    for(int i = 1; i <= lastDay; i++) {
        if(!isTravelDays[i]) { // no need to buy ticket if it is not a travel day
            dp[i] = dp[i - 1];
            continue;
        }
        // select which type of ticket to buy
        dp[i] = costs[0] + dp[i - 1]; // 1-day
        dp[i] = Math.min(costs[1] + dp[Math.max(i - 7, 0)], dp[i]); // 7-day
        dp[i] = Math.min(costs[2] + dp[Math.max(i - 30, 0)], dp[i]); // 30-day
    }
    return dp[lastDay];
}

参考

https://leetcode.com/problems/minimum-cost-for-tickets/discuss/227130/Java-DP-Solution-with-detailed-comment-and-explanation

Read more

Spring Boot集成zxing实现生成二维码功能

Spring Boot集成zxing实现生成二维码功能

1.二维码介绍 二维码QR Code(Quick Response Code) 由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。 ZXing 一个支持在图像中解码和生成条形码(如二维码、PDF 417、EAN、UPC、Aztec、Data Matrix、Codabar)的库。ZXing(“zebra crossing”)是一个开源的、多格式的、用Java实现的一维/二维条码图像处理库,具有到其他语言的端口。 2.代码功能 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project

By Ne0inhk
Spring Boot集成JSch快速入门demo

Spring Boot集成JSch快速入门demo

1.JSch介绍 JSch是SSH2的纯Java实现。JSch允许您连接到sshd服务器并使用端口转发,X11转发,文件传输等,并且可以将其功能集成到您自己的Java程序中。 2.实现原理 * 根据远程主机的IP地址,用户名和端口,建立会话(Session) * 设置用户信息(包括密码和Userinfo),然后连接session,getSession()只是创建一个session,需要设置必要的认证信息之后,调用connect()才能建立连接。 * 设置channel上需要远程执行的Shell脚本,连接channel,就可以远程执行该Shell脚本,调用openChannel(String type) 可以在session上打开指定类型的channel。该channel只是被初始化,使用前需要先调用connect()进行连接。 * 可以读取远程执行Shell脚本的输出,然后依次断开channel和session的连接 3.代码工程 实验目标:实现文件上传到服务,服务器下载文件以及执行服务器命令 pom.xml <?xml version="1.0" encod

By Ne0inhk
Spring Boot集成JPA快速入门demo

Spring Boot集成JPA快速入门demo

1.JPA介绍 JPA (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的凌乱局面。JPA 在充分吸收了现有Hibernate,TopLink,JDO 等ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从上面的解释中我们可以了解到JPA 是一套规范,而类似 Hibernate,TopLink,JDO这些产品是实现了 JPA 规范。 spring Data JPA 是 Spring 基于 ORM 框架、

By Ne0inhk
Spring Boot集成hikari快速入门demo

Spring Boot集成hikari快速入门demo

1.hikari介绍 Hikari是快速,简单,可靠和生产就绪的JDBC连接池。在Spring Boot 2.0版本中,默认数据库池技术已从Tomcat Pool切换到Hikari。这是因为Hikari提供了卓越的性能。现在自Spring Boot 2.0发布以来,spring-boot-starter-jdbc和spring-boot-starter-data-jpa默认解析Hikari依赖, spring.datasource.type属性将HikariDataSource作为默认值。 2.mysql环境搭建 参考代码仓库里面的mysql模块,这里只贴出docker-compose.yml version: '3' services: mysql: image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:5.7 container_name: mysql_3306 restart: unless-stopped

By Ne0inhk