Skip to content

Commit 6cdee56

Browse files
committed
feat: add solutions to lc problem: No.0568
No.0568.Maximum Vacation Days
1 parent 7993360 commit 6cdee56

File tree

6 files changed

+331
-2
lines changed

6 files changed

+331
-2
lines changed

solution/0500-0599/0568.Maximum Vacation Days/README.md

Lines changed: 120 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,22 +80,141 @@ Ans = 7 + 7 + 7 = 21
8080

8181
<!-- 这里可写通用的实现逻辑 -->
8282

83+
**方法一:动态规划**
84+
85+
我们定义 $f[k][j]$ 表示前 $k$ 周,且最后一周在城市 $j$ 休假的最长天数。初始时 $f[0][0]=0$,其它 $f[0][j]=-\infty$。答案为 $\max_{j=0}^{n-1} f[K][j]$。
86+
87+
接下来,我们考虑如何计算 $f[k][j]$。对于当前这一周,我们可以枚举上一周所在的城市 $i$,城市 $i$ 可以和城市 $j$ 相等,那么 $f[k][j] = f[k-1][i]$;也可以和城市 $j$ 不相等,如果不相等,我们需要判断是否可以从城市 $i$ 飞到城市 $j$,如果可以,那么 $f[k][j] = max(f[k][j], f[k-1][i])$。最后,我们还需要加上这一周在城市 $j$ 休假的天数 $days[j][k-1]$。
88+
89+
最终的答案即为 $\max_{j=0}^{n-1} f[K][j]$。
90+
91+
时间复杂度 $O(K \times n^2)$,空间复杂度 $O(K \times n)$。其中 $K$ 和 $n$ 分别为周数和城市数。
92+
8393
<!-- tabs:start -->
8494

8595
### **Python3**
8696

8797
<!-- 这里可写当前语言的特殊实现逻辑 -->
8898

8999
```python
90-
100+
class Solution:
101+
def maxVacationDays(self, flights: List[List[int]], days: List[List[int]]) -> int:
102+
n = len(flights)
103+
K = len(days[0])
104+
f = [[-inf] * n for _ in range(K + 1)]
105+
f[0][0] = 0
106+
for k in range(1, K + 1):
107+
for j in range(n):
108+
f[k][j] = f[k - 1][j]
109+
for i in range(n):
110+
if flights[i][j]:
111+
f[k][j] = max(f[k][j], f[k - 1][i])
112+
f[k][j] += days[j][k - 1]
113+
return max(f[-1][j] for j in range(n))
91114
```
92115

93116
### **Java**
94117

95118
<!-- 这里可写当前语言的特殊实现逻辑 -->
96119

97120
```java
121+
class Solution {
122+
public int maxVacationDays(int[][] flights, int[][] days) {
123+
int n = flights.length;
124+
int K = days[0].length;
125+
final int inf = 1 << 30;
126+
int[][] f = new int[K + 1][n];
127+
for (var g : f) {
128+
Arrays.fill(g, -inf);
129+
}
130+
f[0][0] = 0;
131+
for (int k = 1; k <= K; ++k) {
132+
for (int j = 0; j < n; ++j) {
133+
f[k][j] = f[k - 1][j];
134+
for (int i = 0; i < n; ++i) {
135+
if (flights[i][j] == 1) {
136+
f[k][j] = Math.max(f[k][j], f[k - 1][i]);
137+
}
138+
}
139+
f[k][j] += days[j][k - 1];
140+
}
141+
}
142+
int ans = 0;
143+
for (int j = 0; j < n; ++j) {
144+
ans = Math.max(ans, f[K][j]);
145+
}
146+
return ans;
147+
}
148+
}
149+
```
150+
151+
### **C++**
152+
153+
```cpp
154+
class Solution {
155+
public:
156+
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
157+
int n = flights.size();
158+
int K = days[0].size();
159+
int f[K + 1][n];
160+
memset(f, -0x3f, sizeof(f));
161+
f[0][0] = 0;
162+
for (int k = 1; k <= K; ++k) {
163+
for (int j = 0; j < n; ++j) {
164+
f[k][j] = f[k - 1][j];
165+
for (int i = 0; i < n; ++i) {
166+
if (flights[i][j] == 1) {
167+
f[k][j] = max(f[k][j], f[k - 1][i]);
168+
}
169+
}
170+
f[k][j] += days[j][k - 1];
171+
}
172+
}
173+
int ans = 0;
174+
for (int j = 0; j < n; ++j) {
175+
ans = max(ans, f[K][j]);
176+
}
177+
return ans;
178+
}
179+
};
180+
```
98181
182+
### **Go**
183+
184+
```go
185+
func maxVacationDays(flights [][]int, days [][]int) (ans int) {
186+
n, K := len(flights), len(days[0])
187+
f := make([][]int, K+1)
188+
for i := range f {
189+
f[i] = make([]int, n)
190+
for j := range f[i] {
191+
f[i][j] = -(1 << 30)
192+
}
193+
}
194+
f[0][0] = 0
195+
for k := 1; k <= K; k++ {
196+
for j := 0; j < n; j++ {
197+
f[k][j] = f[k-1][j]
198+
for i := 0; i < n; i++ {
199+
if flights[i][j] == 1 {
200+
f[k][j] = max(f[k][j], f[k-1][i])
201+
}
202+
}
203+
f[k][j] += days[j][k-1]
204+
}
205+
}
206+
for j := 0; j < n; j++ {
207+
ans = max(ans, f[K][j])
208+
}
209+
return
210+
}
211+
212+
func max(a, b int) int {
213+
if a > b {
214+
return a
215+
}
216+
return b
217+
}
99218
```
100219

101220
### **...**

solution/0500-0599/0568.Maximum Vacation Days/README_EN.md

Lines changed: 110 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,122 @@ Ans = 7 + 7 + 7 = 21
8080
### **Python3**
8181

8282
```python
83-
83+
class Solution:
84+
def maxVacationDays(self, flights: List[List[int]], days: List[List[int]]) -> int:
85+
n = len(flights)
86+
K = len(days[0])
87+
f = [[-inf] * n for _ in range(K + 1)]
88+
f[0][0] = 0
89+
for k in range(1, K + 1):
90+
for j in range(n):
91+
f[k][j] = f[k - 1][j]
92+
for i in range(n):
93+
if flights[i][j]:
94+
f[k][j] = max(f[k][j], f[k - 1][i])
95+
f[k][j] += days[j][k - 1]
96+
return max(f[-1][j] for j in range(n))
8497
```
8598

8699
### **Java**
87100

88101
```java
102+
class Solution {
103+
public int maxVacationDays(int[][] flights, int[][] days) {
104+
int n = flights.length;
105+
int K = days[0].length;
106+
final int inf = 1 << 30;
107+
int[][] f = new int[K + 1][n];
108+
for (var g : f) {
109+
Arrays.fill(g, -inf);
110+
}
111+
f[0][0] = 0;
112+
for (int k = 1; k <= K; ++k) {
113+
for (int j = 0; j < n; ++j) {
114+
f[k][j] = f[k - 1][j];
115+
for (int i = 0; i < n; ++i) {
116+
if (flights[i][j] == 1) {
117+
f[k][j] = Math.max(f[k][j], f[k - 1][i]);
118+
}
119+
}
120+
f[k][j] += days[j][k - 1];
121+
}
122+
}
123+
int ans = 0;
124+
for (int j = 0; j < n; ++j) {
125+
ans = Math.max(ans, f[K][j]);
126+
}
127+
return ans;
128+
}
129+
}
130+
```
131+
132+
### **C++**
133+
134+
```cpp
135+
class Solution {
136+
public:
137+
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
138+
int n = flights.size();
139+
int K = days[0].size();
140+
int f[K + 1][n];
141+
memset(f, -0x3f, sizeof(f));
142+
f[0][0] = 0;
143+
for (int k = 1; k <= K; ++k) {
144+
for (int j = 0; j < n; ++j) {
145+
f[k][j] = f[k - 1][j];
146+
for (int i = 0; i < n; ++i) {
147+
if (flights[i][j] == 1) {
148+
f[k][j] = max(f[k][j], f[k - 1][i]);
149+
}
150+
}
151+
f[k][j] += days[j][k - 1];
152+
}
153+
}
154+
int ans = 0;
155+
for (int j = 0; j < n; ++j) {
156+
ans = max(ans, f[K][j]);
157+
}
158+
return ans;
159+
}
160+
};
161+
```
89162
163+
### **Go**
164+
165+
```go
166+
func maxVacationDays(flights [][]int, days [][]int) (ans int) {
167+
n, K := len(flights), len(days[0])
168+
f := make([][]int, K+1)
169+
for i := range f {
170+
f[i] = make([]int, n)
171+
for j := range f[i] {
172+
f[i][j] = -(1 << 30)
173+
}
174+
}
175+
f[0][0] = 0
176+
for k := 1; k <= K; k++ {
177+
for j := 0; j < n; j++ {
178+
f[k][j] = f[k-1][j]
179+
for i := 0; i < n; i++ {
180+
if flights[i][j] == 1 {
181+
f[k][j] = max(f[k][j], f[k-1][i])
182+
}
183+
}
184+
f[k][j] += days[j][k-1]
185+
}
186+
}
187+
for j := 0; j < n; j++ {
188+
ans = max(ans, f[K][j])
189+
}
190+
return
191+
}
192+
193+
func max(a, b int) int {
194+
if a > b {
195+
return a
196+
}
197+
return b
198+
}
90199
```
91200

92201
### **...**
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class Solution {
2+
public:
3+
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
4+
int n = flights.size();
5+
int K = days[0].size();
6+
int f[K + 1][n];
7+
memset(f, -0x3f, sizeof(f));
8+
f[0][0] = 0;
9+
for (int k = 1; k <= K; ++k) {
10+
for (int j = 0; j < n; ++j) {
11+
f[k][j] = f[k - 1][j];
12+
for (int i = 0; i < n; ++i) {
13+
if (flights[i][j] == 1) {
14+
f[k][j] = max(f[k][j], f[k - 1][i]);
15+
}
16+
}
17+
f[k][j] += days[j][k - 1];
18+
}
19+
}
20+
int ans = 0;
21+
for (int j = 0; j < n; ++j) {
22+
ans = max(ans, f[K][j]);
23+
}
24+
return ans;
25+
}
26+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
func maxVacationDays(flights [][]int, days [][]int) (ans int) {
2+
n, K := len(flights), len(days[0])
3+
f := make([][]int, K+1)
4+
for i := range f {
5+
f[i] = make([]int, n)
6+
for j := range f[i] {
7+
f[i][j] = -(1 << 30)
8+
}
9+
}
10+
f[0][0] = 0
11+
for k := 1; k <= K; k++ {
12+
for j := 0; j < n; j++ {
13+
f[k][j] = f[k-1][j]
14+
for i := 0; i < n; i++ {
15+
if flights[i][j] == 1 {
16+
f[k][j] = max(f[k][j], f[k-1][i])
17+
}
18+
}
19+
f[k][j] += days[j][k-1]
20+
}
21+
}
22+
for j := 0; j < n; j++ {
23+
ans = max(ans, f[K][j])
24+
}
25+
return
26+
}
27+
28+
func max(a, b int) int {
29+
if a > b {
30+
return a
31+
}
32+
return b
33+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public int maxVacationDays(int[][] flights, int[][] days) {
3+
int n = flights.length;
4+
int K = days[0].length;
5+
final int inf = 1 << 30;
6+
int[][] f = new int[K + 1][n];
7+
for (var g : f) {
8+
Arrays.fill(g, -inf);
9+
}
10+
f[0][0] = 0;
11+
for (int k = 1; k <= K; ++k) {
12+
for (int j = 0; j < n; ++j) {
13+
f[k][j] = f[k - 1][j];
14+
for (int i = 0; i < n; ++i) {
15+
if (flights[i][j] == 1) {
16+
f[k][j] = Math.max(f[k][j], f[k - 1][i]);
17+
}
18+
}
19+
f[k][j] += days[j][k - 1];
20+
}
21+
}
22+
int ans = 0;
23+
for (int j = 0; j < n; ++j) {
24+
ans = Math.max(ans, f[K][j]);
25+
}
26+
return ans;
27+
}
28+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
class Solution:
2+
def maxVacationDays(self, flights: List[List[int]], days: List[List[int]]) -> int:
3+
n = len(flights)
4+
K = len(days[0])
5+
f = [[-inf] * n for _ in range(K + 1)]
6+
f[0][0] = 0
7+
for k in range(1, K + 1):
8+
for j in range(n):
9+
f[k][j] = f[k - 1][j]
10+
for i in range(n):
11+
if flights[i][j]:
12+
f[k][j] = max(f[k][j], f[k - 1][i])
13+
f[k][j] += days[j][k - 1]
14+
return max(f[-1][j] for j in range(n))

0 commit comments

Comments
 (0)