前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 568. 最大休假天数(DP)

LeetCode 568. 最大休假天数(DP)

作者头像
Michael阿明
发布2021-02-19 10:59:12
9350
发布2021-02-19 10:59:12
举报
文章被收录于专栏:Michael阿明学习之路

文章目录

1. 题目

力扣想让一个最优秀的员工在 N 个城市间旅行来收集算法问题。 但只工作不玩耍,聪明的孩子也会变傻,所以您可以在某些特定的城市和星期休假。 您的工作就是安排旅行使得最大化你可以休假的天数,但是您需要遵守一些规则和限制。

规则和限制:

  • 您只能在 N 个城市之间旅行,用 0 到 N-1 的索引表示。一开始,您在索引为0的城市,并且那天是星期一
  • 这些城市通过航班相连。这些航班用 N*N 矩阵 flights(不一定是对称的)表示,flights[i][j] 代表城市i到城市j的航空状态。如果没有城市i到城市j的航班,flights[i][j] = 0;否则,flights[i][j] = 1。同时,对于所有的 i,flights[i][i] = 0
  • 您总共有 K 周(每周7天)的时间旅行。您每天最多只能乘坐一次航班,并且只能在每周的星期一上午乘坐航班。由于飞行时间很短,我们不考虑飞行时间的影响。
  • 对于每个城市,不同的星期您休假天数是不同的,给定一个 N*K 矩阵 days 代表这种限制,days[i][j] 代表您在第j个星期在城市i能休假的最长天数。 给定 flights 矩阵和 days 矩阵,您需要输出 K 周内可以休假的最长天数。
代码语言:javascript
复制
示例 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. 
由于没有航班可以让您飞到其他城市,你必须在城市0呆整整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天。
 
注意:
N 和 K 都是正整数,在 [1, 100] 范围内。
矩阵 flights 的所有值都是 [0, 1] 范围内的整数。
矩阵 days 的所有值都是 [0, 7] 范围内的整数。
超过休假天数您仍可以呆在那个城市,但是在额外的日子您需要 工作 ,
这些日子不会算做休假日。
如果您从城市A飞往城市B并在当天休假日,
这个休假会被算作是城市B的休假日。
我们不考虑飞行时间对计算休假日的影响。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-vacation-days 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

代码语言:javascript
复制
class Solution {
public:
    int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
    	int dp[100][100];// 在 i 城市时, 是第 k 周, 最多休假天数
    	memset(dp, 0xff, sizeof(dp));
        int n = flights.size(), k = days[0].size(), maxdays = 0;
    	for(int i = 0; i < n; ++i)
    	{
            //可以待在原地不走
    		flights[i][i] = 1;
    	}    	
    	for(int i = 0; i < n; ++i)//初始化第0周
    	{
    		if(flights[0][i])//0城市可以飞到i城市
    		{
                dp[i][0] = days[i][0];
                maxdays = max(maxdays, dp[i][0]);
            }
    	}
    	for(int wk = 1; wk < k; ++wk)//遍历剩余的周
    	{
    		for(int i = 0; i < n; ++i)//遍历每个城市
    		{
    			if(dp[i][wk-1] == -1)//上周i城市的状态不存在
    				continue;
    			for(int j = 0; j < n; ++j)//我要去 j 城市
    			{
    				if(!flights[i][j])//没有航班,不行
    					continue;
    				dp[j][wk] = max(dp[j][wk], dp[i][wk-1]+days[j][wk]);
                    maxdays = max(maxdays, dp[j][wk]);
    			}
    		}
    	}
    	return maxdays;
    }
};

276 ms 18.6 MB

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/08/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档