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:

  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 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.
  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: 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.

思路:DFS + Memo: 注意当前一层week,我可以take flight,去任何一个大的value,所以value 加的是days[j][week];只要curcity == j || flights[curcity][j] == 1,那么就可以计算下一层;

class Solution {
    public int maxVacationDays(int[][] flights, int[][] days) {
        if(flights == null || flights.length == 0 || days == null || days.length == 0) {
            return 0;
        }
        int n = days.length; // city;
        int m = days[0].length; // week;
        Integer[][] cache = new Integer[n][m];
        return dfs(flights, days, 0, 0, cache);
    }
    
    private int dfs(int[][] flights, int[][] days, int curcity, int week, Integer[][] cache) {
        if(week == days[0].length) {
            return 0;    
        }
        if(cache[curcity][week] != null) {
            return cache[curcity][week];
        }
        int value = 0;
        // loop all the city;
        for(int j = 0; j < days.length; j++) {
            if(curcity == j || flights[curcity][j] == 1) {
                                       // 当前week可以达到的最大 + 下一层的最大;
                value = Math.max(value, days[j][week] + dfs(flights, days, j, week + 1, cache));
            }
        }
        cache[curcity][week] = value;
        return cache[curcity][week];
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值