[LeetCode] 568. Maximum Vacation Days 最大化休假日
LeetCode wants to give one of its best employees the option to travel among N cities to collect algorithm problems. But all work and no play makes Jack a dull boy, you could take vacations in some particular cities and weeks. Your job is to schedule the traveling to maximize the number of vacation days you could take, but there are certain rules and restrictions you need to follow.
Rules and restrictions:
- You can only travel among N cities, represented by indexes from 0 to N-1. Initially, you are in the city indexed 0 on Monday.
- The cities are connected by flights. The flights are represented as a N*N matrix (not necessary symmetrical), called flights representing the airline status from the city i to the city j. If there is no flight from the city i to the city j, flights[i][j] = 0; Otherwise, flights[i][j] = 1. Also, flights[i][i] = 0 for all i.
- You totally have K weeks (each week has 7 days) to travel. You can only take flights at most once per day and can only take flights on each week's Monday morning. Since flight time is so short, we don't consider the impact of flight time.
- For each city, you can only have restricted vacation days in different weeks, given an N*K matrix called days representing this relationship. For the value of days[i][j], it represents the maximum days you could take vacation in the city i in the week j.
You're given the flights matrix and days matrix, and you need to output the maximum vacation days you could take during K weeks.
Example 1:
Input:flights = [[0,1,1],[1,0,1],[1,1,0]], days = [[1,3,1],[6,0,3],[3,3,3]]
Output: 12
Explanation:
Ans = 6 + 3 + 3 = 12.
One of the best strategies is:
1st week : fly from city 0 to city 1 on Monday, and play 6 days and work 1 day.
(Although you start at city 0, we could also fly to and start at other cities since it is Monday.)
2nd week : fly from city 1 to city 2 on Monday, and play 3 days and work 4 days.
3rd week : stay at city 2, and play 3 days and work 4 days.
Example 2:
Input:flights = [[0,0,0],[0,0,0],[0,0,0]], days = [[1,1,1],[7,7,7],[7,7,7]]
Output: 3
Explanation:
Ans = 1 + 1 + 1 = 3.
Since there is no flights enable you to move to another city, you have to stay at city 0 for the whole 3 weeks.
For each week, you only have one day to play and six days to work.
So the maximum number of vacation days is 3.
Example 3:
Input:flights = [[0,1,1],[1,0,1],[1,1,0]], days = [[7,0,0],[0,7,0],[0,0,7]]
Output: 21
Explanation:
Ans = 7 + 7 + 7 = 21
One of the best strategies is:
1st week : stay at city 0, and play 7 days.
2nd week : fly from city 0 to city 1 on Monday, and play 7 days.
3rd week : fly from city 1 to city 2 on Monday, and play 7 days.
Note:
- N and K are positive integers, which are in the range of [1, 100].
- In the matrix flights, all the values are integers in the range of [0, 1].
- In the matrix days, all the values are integers in the range [0, 7].
- You could stay at a city beyond the number of vacation days, but you should work on the extra days, which won't be counted as vacation days.
- If you fly from the city A to the city B and take the vacation on that day, the deduction towards vacation days will count towards the vacation days of city B in that week.
- We don't consider the impact of flight hours towards the calculation of vacation days.
flights是n*n矩阵, 表示city之间是否能飞; days[i][j] 是n*k矩阵,表示在city i,week j 这个时间最多能玩几天。初始是在city 0, 问最多能玩几天。注意的是第一周不一定非得在city 0, 可以当天飞到其他city开始。
解法1:DFS, 对每一个当前city,遍历所有它能到达的城市,返回当前week在cur_city能得到的最大值,days[i][week] + dfs(flights, days, i, week+1, data),通过打表data来保存中间值,不然会超时。
解法2:DP, 用dp[i][j]来表示 week i in city j, 最多可以得到多少个vacation。dp[i][j] = max(dp[i - 1][k] + days[j][i]) (k = 0...N - 1, if we can go from city k to city j)
Java: DFS
public class Solution {
int max = 0, N = 0, K = 0;
public int maxVacationDays(int[][] flights, int[][] days) {
N = flights.length;
K = days[0].length;
dfs(flights, days, 0, 0, 0);
return max;
}
//curr: current city
private void dfs(int[][] f, int[][] d, int curr, int week, int sum) {
if (week == K) {
max = Math.max(max, sum);
return;
}
for (int dest = 0; dest < N; dest++) {
if (curr == dest || f[curr][dest] == 1) {
dfs(f, d, dest, week + 1, sum + d[dest][week]);
}
}
}
}
Java: DP
public class Solution {
public int maxVacationDays(int[][] flights, int[][] days) {
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) {
temp[j] = Math.max(temp[j], dp[k] + days[j][i]);
}
}
}
dp = temp;
}
int max = 0;
for (int v : dp) {
max = Math.max(max, v);
}
return max;
}
}
Java: DP
public int maxVacationDays(int[][] flights, int[][] days) {
int N = flights.length, K = days[0].length;
int[] dp = new int[N];
for (int i=K-1;i>=0;i--) {
int[] temp = new int[N];
for (int j=0;j<N;j++) {
temp[j] = days[j][i];
int max = dp[j];
for (int n=0;n<N;n++)
if (flights[j][n] == 1) max = Math.max(max, dp[n]);
temp[j] += max;
}
dp = temp;
}
int max = dp[0];
for (int i=0;i<N;i++)
if (flights[0][i] == 1) max = Math.max(max, dp[i]);
return max;
}
Python:
# Time: O(n^2 * k)
# Space: O(k)
class Solution(object):
def maxVacationDays(self, flights, days):
"""
:type flights: List[List[int]]
:type days: List[List[int]]
:rtype: int
"""
if not days or not flights:
return 0
dp = [[0] * len(days) for _ in xrange(2)]
for week in reversed(xrange(len(days[0]))):
for cur_city in xrange(len(days)):
dp[week % 2][cur_city] = days[cur_city][week] + dp[(week+1) % 2][cur_city]
for dest_city in xrange(len(days)):
if flights[cur_city][dest_city] == 1:
dp[week % 2][cur_city] = max(dp[week % 2][cur_city], \
days[dest_city][week] + dp[(week+1) % 2][dest_city])
return dp[0][0]
C++:
// Time: O(n^2 * k)
// Space: O(k)
class Solution {
public:
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
if (days.empty() || flights.empty()) {
return 0;
}
vector<vector<int>> dp(2, vector<int>(days.size()));
for (int week = days[0].size() - 1; week >= 0; --week) {
for (int cur_city = 0; cur_city < days.size(); ++cur_city) {
dp[week % 2][cur_city] = days[cur_city][week] + dp[(week + 1) % 2][cur_city];
for (int dest_city = 0; dest_city < days.size(); ++dest_city) {
if (flights[cur_city][dest_city] == 1) {
dp[week % 2][cur_city] = max(dp[week % 2][cur_city],
days[dest_city][week] + dp[(week + 1) % 2][dest_city]);
}
}
}
}
return dp[0][0];
}
};
C++:
class Solution {
public:
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
int n = flights.size(), k = days[0].size(), res = 0;
vector<vector<int>> dp(n, vector<int>(k, 0));
for (int j = k - 1; j >= 0; --j) {
for (int i = 0; i < n; ++i) {
dp[i][j] = days[i][j];
for (int p = 0; p < n; ++p) {
if ((i == p || flights[i][p]) && j < k - 1) {
dp[i][j] = max(dp[i][j], dp[p][j + 1] + days[i][j]);
}
if (j == 0 && (i == 0 || flights[0][i])) res = max(res, dp[i][0]);
}
}
}
return res;
}
};
C++:
class Solution {
public:
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
int n = flights.size(), k = days[0].size();
vector<int> dp(n, INT_MIN);
dp[0] = 0;
for (int j = 0; j < k; ++j) {
vector<int> t(n, INT_MIN);
for (int i = 0; i < n; ++i) {
for (int p = 0; p < n; ++p) {
if (i == p || flights[p][i]) {
t[i] = max(t[i], dp[p] + days[i][j]);
}
}
}
dp = t;
}
return *max_element(dp.begin(), dp.end());
}
};
All LeetCode Questions List 题目汇总
[LeetCode] 568. Maximum Vacation Days 最大化休假日的更多相关文章
- [LeetCode] Maximum Vacation Days 最大化休假日
LeetCode wants to give one of its best employees the option to travel among N cities to collect algo ...
- LeetCode 568. Maximum Vacation Days
原题链接在这里:https://leetcode.com/problems/maximum-vacation-days/ 题目: LeetCode wants to give one of its b ...
- 568. Maximum Vacation Days
Problem statement: LeetCode wants to give one of its best employees the option to travel among N ci ...
- [array] leetcode - 53. Maximum Subarray - Easy
leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...
- [LeetCode] 152. Maximum Product Subarray_Medium tag: Dynamic Programming
Given an integer array nums, find the contiguous subarray within an array (containing at least one n ...
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- [LeetCode] 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组
Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...
- [LeetCode] 628. Maximum Product of Three Numbers 三个数字的最大乘积
Given an integer array, find three numbers whose product is maximum and output the maximum product. ...
- [LeetCode] Third Maximum Number 第三大的数
Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...
随机推荐
- 解决 Vue 刷新页面后 store 数据丢失的问题
原来的状态(页面刷新数据会重置) state: { teamA: '主队' }, mutations: { data_teamA(state, x) { state.teamA = x } }, ...
- 2019年牛客多校第一场 E题 ABBA DP
题目链接 传送门 思路 首先我们知道\('A'\)在放了\(n\)个位置里面是没有约束的,\('B'\)在放了\(m\)个位置里面也是没有约束的,其他情况见下面情况讨论. \(dp[i][j]\)表示 ...
- Vue和微信小程序区别
一.生命周期 先贴两张图: vue生命周期 小程序生命周期 相比之下,小程序的钩子函数要简单得多. vue的钩子函数在跳转新页面时,钩子函数都会触发,但是小程序的钩子函数,页面不同的跳转方式,触发的钩 ...
- 在命令行中执行kms命令激活Microsoft Office 2010
激活office2010的命令是什么?激活office2010除了使用office2010激活工具之外,还可以使用kms命令来激活office2010,但是office2010激活命令还需考虑32位或 ...
- 注解@Transient
@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Bas ...
- 【模板】A*B Problem(FFT快速傅里叶)
题目:给出两个n位10进制整数x和y,你需要计算x*y.($n \leq 60000$) 分析: 两个正整数的相乘可以视为两个多项式的相乘, 例如 $15 \times 16 = 240$, 可写成 ...
- tensorflow 2.0 学习(四)
这次的mnist学习加入了测试集,看看学习的准确率,代码如下 # encoding: utf-8 import tensorflow as tf import matplotlib.pyplot as ...
- CLR内部异常(上)
当我们提到CLR里的“异常”,要注意一个很重要的区别.有通过如C#的try/catch/finally暴露给应用程序,并由运行时提供机制全权实现的托管异常.也有运行时自己使用的异常.大部分运行时开发人 ...
- PowerDesigner 创建表的时候 没有自增长Id的设置项
今天早上同事创建表的时候,在那个界面没有自增长Id的选项,当时我也纳闷,软件肯定都是一样的,设置的步骤都一样(有些配置好的 我就没改过 然后就忘了还改过些什么步骤了),结果还是没有那个选项 百度了一下 ...
- AGC028 E - High Elements
AGC028 E - High Elements 有一个排列\(p\),你要分成两个子序列\(A,B\),满足\(A,B\)的LIS长度相等.设\(S\)是一个\(01\)序列,\(S_i=0\)当且 ...