LintCode领扣 题解丨 谷歌面试高频题:最大假期天数

简介: LintCode领扣 题解丨 谷歌面试高频题:最大假期天数

LintCode想让它最好的员工之一选择在N个城市间旅行来收集算法问题。但是只工作不玩耍,聪明的孩子也会变傻,你可以在某些特定的城市并且一个星期里去度假。你的工作是安排旅行,尽可能多的假期,但是有一些规则和限制你需要遵守。

规则和限制:

您只能在1个城市中旅行,由0到N-1的索引表示。一开始,你周一在城市0。

这些城市都是通过航班连接起来的。这些航班被表示为N*N矩阵(非必要对称),称为代表航空公司从城市i到j城市状态的flights矩阵。如果没有从城市i到城市j的航班,flightsi = 0;否则,flightsi= 1。还有,flightsi = 0。

你总共有K周(每周有7天)旅行。你只能每天最多乘坐一次航班,而且只能在每周一早上乘坐航班。由于飞行时间太短,我们不考虑飞行时间的影响。

对于每个城市,你只能在不同的星期里限制休假日,给定一个命名为days的N*K矩阵表示这种关系。对于daysi的值,它表示你可以在j+1周的城市i里休假的最长天数,你得到的是flights矩阵和days矩阵,你需要输出你在K周期间可以获得的最长假期。

N和K是正整数,它们在[1, 100]的范围内。
在flights矩阵中,所有的值都是在[0, 1]范围内的整数。
在days矩阵中,所有的值都是范围内的整数[0, 7]。
你可以呆在一个超过假期天数的城市,但是你应该多工作几天,这不会算作休假日。
如果你从A市飞到B市,并在那天休假,那么假期的扣除将计入B城市的假期天数。
我们不考虑飞行时间对计算假期的影响。
在线评测地址:https://www.lintcode.com/problem/maximum-vacation-days/?utm_source=sc-tc-sz0813

样例 1:

输入:flights = [[0,1,1],[1,0,1],[1,1,0]],days = [[1,3,1],[6,0,3],[3,3,3]]
输出:12
解释:
Ans = 6 + 3 + 3 = 12.

最好的策略之一是:

第一周:周一从城市0飞往城市1,休假6天,工作1天。
(虽然你从城市0开始,但从周一开始,我们也可以飞到其他城市去。)
第二周:周一从城市1飞到城市2,休假3天,工作4天。
第三周:呆在城市2,休假3天,工作4天。

样例 2:

输入: flights = [[0,0,0],[0,0,0],[0,0,0]],days = [[1,1,1],[7,7,7],[7,7,7]]
输出:3
解释:
Ans = 1 + 1 + 1 = 3.


因为没有航班可以让你飞到另一个城市,所以你必须在城市里呆3个星期。
每个星期,你只有一天休假的时间和六天的工作。
所以假期的最大天数是3

样例 3:

输入:flights = [[0,1,1],[1,0,1],[1,1,0]],days = [[7,0,0],[0,7,0],[0,0,7]]
输出:21
解释:
Ans = 7 + 7 + 7 = 21.


最好的策略之一是:
第一周:呆在城市0,玩7天。
第二周:周一从城市0飞到城市1,然后休假7天。
第三周:周一从城市1飞到城市2,然后休假7天。

【题解】

考点:

dp
题解:

dp[i]表示最后到达i城市的最长休假时间。先枚举周数,然后枚举终点,然后是起点,判断是否前往(temp[j] = Math.max(temp[j], dp[k] + daysj);),即是否进行转移。每周更新dp数组,最后从dp数组选择最大值即可。

public class Solution {

/**
 * @param flights: the airline status from the city i to the city j
 * @param days: days[i][j] represents the maximum days you could take vacation in the city i in the week j
 * @return: the maximum vacation days you could take during K weeks
 */
public int maxVacationDays(int[][] flights, int[][] days) {
    // Write your code here
    int N = flights.length;
    int K = days[0].length;
    int[] dp = new int[N];
    Arrays.fill(dp, Integer.MIN_VALUE);
    dp[0] = 0;
    for (int i = 0; i < K; i++) {            //逐渐扩大枚举周
        int[] temp = new int[N];
        Arrays.fill(temp, Integer.MIN_VALUE);
        for (int j = 0; j < N; j++) {            //枚举终点
            for(int k = 0; k < N; k++) {            //枚举起点
                if (j == k || flights[k][j] == 1) {            //如果城市k到城市j存在航班
                    temp[j] = Math.max(temp[j], dp[k] + days[j][i]);        //则再对当前答案进行选择,即是否从k前往j
                }
            }
        }
        dp = temp;
    }
    
    int ans = 0;
    for(int i = 0; i < N; i++){            //最后对dp数组筛选最大值即可
        ans = Math.max(ans, dp[i]);
    }
    return ans;
}

}
更多题解参见九章算法官网:
https://www.jiuzhang.com/solution/maximum-vacation-days/?utm_source=sc-tc-sz0813

相关文章
|
存储 自然语言处理 算法
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
|
11月前
|
算法 C++
【每日算法Day 72】谷歌面试题:又双叒叕是位运算,最详细的自动机推导过程
【每日算法Day 72】谷歌面试题:又双叒叕是位运算,最详细的自动机推导过程
|
Prometheus 监控 Cloud Native
面试高频:Go语言死锁与goroutine泄露问题谈论
面试高频:Go语言死锁与goroutine泄露问题谈论
|
JavaScript 前端开发 安全
js 函数进阶(面试高频)
函数声明方式 function 关键字(命名函数)。 function fn(){ }
85 0
|
前端开发 容器
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
508 6
🍊Flex布局最佳实践之骰子实战篇(面试高频考点,速来围观呀~)
|
存储 缓存 NoSQL
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面,但同时,它也带来了一些问题,其中,最重要的问题,就是数据的一致性问题。从严格意义上讲,这个无解。如果对数据的一致性要求很高,那么就不能使用缓存。
131 0
Redis缓存穿透和雪崩相关概念(面试高频,工作常用)
|
消息中间件 NoSQL Java
高频Java面试题集锦(含答案),让你的面试之路畅通无阻!
或许这份面试题还不足以囊括所有 Java 问题,但有了它,我相信你一定不会“败”的很惨,因为有了它,足以应对目前市面上绝大部分的 Java 面试了,因为这篇文章不论是从深度还是广度上来讲,都已经囊括了非常多的知识点了。 凡事预则立,不预则废。能读到这里的人,我相信都是这个世界上的“有心人”,还是那句老话:上天不负有心人!我相信你的每一步努力,都会收获意想不到的回报。
字节跳动------剑指offer专题精选谷歌、微软等知名IT企业典型面试题
字节跳动------剑指offer专题精选谷歌、微软等知名IT企业典型面试题
173 0
字节跳动------剑指offer专题精选谷歌、微软等知名IT企业典型面试题
页面中有父子组件,生命周期顺序如何执行?(面试高频 一篇搞懂)
在实际开发中,一个页面经常会有父组件和子组件,那么在这个页面中,对于父子组件他们的生命周期又是如何执行的呢?看了一些网上的文章资料,竟然有些讲解写的是错误答案,带偏大家,所以在本文利用实践得出结论,带大家彻底搞懂这个知识点~
114 0
页面中有父子组件,生命周期顺序如何执行?(面试高频 一篇搞懂)
|
算法 Java
Map与Set高频面试算法题(只出现一次的数字,复制带随机指针的链表,宝石与石头,旧键盘,前k个高频单词)(Java实现)
给一个非空整数数组,只有一个元素出现了一次,剩余的元素都出现了两次,,请找出那个只出现一次的数字
Map与Set高频面试算法题(只出现一次的数字,复制带随机指针的链表,宝石与石头,旧键盘,前k个高频单词)(Java实现)