You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
package class50;
|
|
|
|
|
|
|
|
|
|
public class Problem_0568_MaximumVacationDays {
|
|
|
|
|
|
|
|
|
|
public static int maxVacationDays(int[][] fly, int[][] day) {
|
|
|
|
|
int n = fly.length;
|
|
|
|
|
int k = day[0].length;
|
|
|
|
|
// pas[i] = {a, b, c}
|
|
|
|
|
// 从a、b、c能飞到i
|
|
|
|
|
int[][] pass = new int[n][];
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
int s = 0;
|
|
|
|
|
for (int j = 0; j < n; j++) {
|
|
|
|
|
if (fly[j][i] != 0) {
|
|
|
|
|
s++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
pass[i] = new int[s];
|
|
|
|
|
for (int j = n - 1; j >= 0; j--) {
|
|
|
|
|
if (fly[j][i] != 0) {
|
|
|
|
|
pass[i][--s] = j;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// dp[i][j] -> 第i周必须在j这座城,0~i-1周(随意),最大休假天数
|
|
|
|
|
int[][] dp = new int[k][n];
|
|
|
|
|
// 飞的时机,是周一早上飞,认为对时间没有影响,直接到某个城,然后过一周
|
|
|
|
|
dp[0][0] = day[0][0];
|
|
|
|
|
for (int j = 1; j < n; j++) {
|
|
|
|
|
dp[0][j] = fly[0][j] != 0 ? day[j][0] : -1;
|
|
|
|
|
}
|
|
|
|
|
for (int i = 1; i < k; i++) { // 第i周
|
|
|
|
|
for (int j = 0; j < n; j++) { // 在j号城过!
|
|
|
|
|
// 第i周,要怎么到j号城
|
|
|
|
|
// 下面max的初始值,我第i-1周,就在j号城,选择不动地方,进入第i周
|
|
|
|
|
int max = dp[i - 1][j];
|
|
|
|
|
for (int p : pass[j]) { // 枚举什么?能到j号城的城市p
|
|
|
|
|
max = Math.max(max, dp[i - 1][p]);
|
|
|
|
|
}
|
|
|
|
|
dp[i][j] = max != -1 ? max + day[j][i] : -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
int ans = 0;
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
ans = Math.max(ans, dp[k - 1][i]);
|
|
|
|
|
}
|
|
|
|
|
return ans;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|