[Leetcode] 568. Maximum Vacation Days 解题报告

来源:互联网 发布:淘宝客推广个多少钱 编辑:程序博客网 时间:2024/05/18 00:16

题目

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:

  1. 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.
  2. The cities are connected by flights. The flights are represented as a N*N matrix (not necessary symmetrical), called flightsrepresenting 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.
  3. 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.
  4. 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: 12Explanation: 
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: 3Explanation: 
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: 21Explanation:
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:

  1. N and K are positive integers, which are in the range of [1, 100].
  2. In the matrix flights, all the values are integers in the range of [0, 1].
  3. In the matrix days, all the values are integers in the range [0, 7].
  4. 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.
  5. 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.
  6. We don't consider the impact of flight hours towards the calculation of vacation days.

思路

用动态规划来求解。我们定义dp[k][n] (0 < k < K, 0 < n < N)表示在第k周在城市n休假时,可以获得的最大休假天数。我们初始化所有dp数组的元素为-1,那么状态转移方程就是:dp[k][n] = max(dp[k-1][c] + days[n][k]),如果dp[k - 1][c] != -1并且(c == n或者flight[c][n] == 1)。否则dp[k][n] = -1。最后返回dp[k][0],...,dp[k][n-1]中的最大值。

算法的时间复杂度是O(KN^2),空间复杂度是O(KN)。

代码

class Solution {public:    int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {        int N = flights.size(), K = days[0].size();        vector<vector<int>> dp(K, vector<int>(N, -1));        dp[0][0] = days[0][0];                  // initial the values in week 0        for (int c = 1; c < N; ++c) {            if (flights[0][c]) {                dp[0][c] = days[c][0];            }        }        for (int k = 1; k < K; ++k) {           // update the values in week k            for (int n = 0; n < N; ++n) {                for (int c = 0; c < N; ++c) {   // try to travel from city c to city n                    if (dp[k - 1][c] != -1) {   // city c is arrivable in week k - 1                        if (c == n || flights[c][n] == 1) {                            dp[k][n] = max(dp[k][n], dp[k - 1][c] + days[n][k]);                        }                    }                }            }        }        int ret = *max_element(dp[K - 1].begin(), dp[K - 1].end());        return ret;    }};

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 如蚁附膻 膻味 膻中怎么读 羊肉如何去膻味 如蝇逐膻 羊膻味 羊肉除膻味妙招 羊肉如何去膻 羊肉去膻 如蚁慕膻 附膻逐腥 膻味读音 羊肉去膻味的调料配方 膻中的准确位置图 羊肉去膻味的方法 小儿膻中的准确位置图 膻焦香怎么读 羊奶怎么去膻味 羊肉膻味怎么去除 膻的读音 中医膻中怎么读 羊肉除膻方法 膻中穴的膻正确读音 羊肉汤怎么做不会膻腥 147西阴人躰阴膻艺术 羊肉为什么有膻味 羊肉馅饺子怎么去膻味 怎样炖羊肉没有羊膻味 如何去除羊肉的膻味 驴肉饺子馅怎么去膻味 怎样去除羊肉的膻味 怎么炖羊肉汤又白又没膻味 不臣 君不密失其臣臣不密失其身 愿伯具言臣之不敢倍德也 臣要君嘤君不得不嘤 权臣今天不上班 安逸臣浮生不若梦 不臣全文阅读 君不密则失臣 臣死且不避卮酒安足辞