题目:
你有 n 颗处理器,每颗处理器都有 4 个核心。现有 n * 4 个待执行任务,每个核心只执行 一个 任务。
给你一个下标从 0 开始的整数数组 processorTime ,表示每颗处理器最早空闲时间。另给你一个下标从 0 开始的整数数组 tasks ,表示执行每个任务所需的时间。返回所有任务都执行完毕需要的 最小时间 。
注意:每个核心独立执行任务。
示例 1:
输入:processorTime = [8,10], tasks = [2,2,3,1,8,7,4,5]
输出:16
解释:
最优的方案是将下标为 4, 5, 6, 7 的任务分配给第一颗处理器(最早空闲时间 time = 8),下标为 0, 1, 2, 3 的任务分配给第二颗处理器(最早空闲时间 time = 10)。
第一颗处理器执行完所有任务需要花费的时间 = max(8 + 8, 8 + 7, 8 + 4, 8 + 5) = 16 。
第二颗处理器执行完所有任务需要花费的时间 = max(10 + 2, 10 + 2, 10 + 3, 10 + 1) = 13 。
因此,可以证明执行完所有任务需要花费的最小时间是 16 。
示例 2:
输入:processorTime = [10,20], tasks = [2,3,1,2,5,8,4,3]
输出:23
解释:
最优的方案是将下标为 1, 4, 5, 6 的任务分配给第一颗处理器(最早空闲时间 time = 10),下标为 0, 2, 3, 7 的任务分配给第二颗处理器(最早空闲时间 time = 20)。
第一颗处理器执行完所有任务需要花费的时间 = max(10 + 3, 10 + 5, 10 + 8, 10 + 4) = 18 。
第二颗处理器执行完所有任务需要花费的时间 = max(20 + 2, 20 + 1, 20 + 2, 20 + 3) = 23 。
因此,可以证明执行完所有任务需要花费的最小时间是 23 。
提示:
1 <= n == processorTime.length <= 25000
1 <= tasks.length <= 10^5
0 <= processorTime[i] <= 10^9
1 <= tasks[i] <= 10^9
tasks.length == 4 * n
java代码:
class Solution {
public int minOperations(String s1, String s2, int x) {
char[] s = s1.toCharArray(), t = s2.toCharArray();
int n = s.length, diff = 0;
for (int i = 0; i < n; i++) {
if (s[i] != t[i]) {
diff ^= 1;
}
}
if (diff > 0) {
return -1;
}
int[][][] memo = new int[n][n + 1][2];
for (int i = 0; i < n; i++) {
for (int j = 0; j <= n; j++) {
Arrays.fill(memo[i][j], -1);// -1 表示没有计算过
}
}
return dfs(n - 1, 0, 0, memo, s, t, x);
}
private int dfs(int i, int j, int preRev, int[][][] memo, char[] s, char[] t, int x) {
if (i < 0) { // 递归边界
return j > 0 || preRev > 0 ? Integer.MAX_VALUE / 2 : 0;
}
if (memo[i][j][preRev] != -1) { // 之前计算过
return memo[i][j][preRev];
}
if ((s[i] == t[i]) == (preRev == 0)) { // 无需反转
return dfs(i - 1, j, 0, memo, s, t, x);
}
int res = Math.min(dfs(i - 1, j + 1, 0, memo, s, t, x) + x, dfs(i - 1, j, 1, memo, s, t, x) + 1);
if (j > 0) { // 可以免费反转
res = Math.min(res, dfs(i - 1, j - 1, 0, memo, s, t, x));
}
return memo[i][j][preRev] = res; // 记忆化
}
}
网友评论