1626. 无矛盾的最佳球队


【DP】这道题我感觉是354. 俄罗斯套娃信封问题的简化版,也是二维的LIS问题。先按照score或者age排序,然后选出最长递增子序列。需要注意排序的时候都是按照两个的从小到大排的,因为具有相同年龄的队员都可以被选,如果乱排的话会出现这种情况,[3, 4], [3, 2],拥有相同的分数,但是年龄是前者大于后者,所以后面年龄为2的就加不上去了。如果,像信封那道题,规定两个维度都必须严格大于的话,用二分+DP的时候就要从大到小排,来保证同一纬度下只有最小的加入了。
class Solution {
public int bestTeamScore(int[] scores, int[] ages) {
int n = ages.length, ans = 0;
int[][] arr = new int[n][2];
for (int i = 0; i < n; i++) arr[i] = new int[] {scores[i], ages[i]};
Arrays.sort(arr, (a, b) -> a[0] == b[0] ? a[1] - b[1]: a[0] - b[0]);
int[] dp = new int[n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
if (arr[i][1] >= arr[j][1]) {
dp[i] = Math.max(dp[i], dp[j]);
}
}
dp[i] += arr[i][0];
ans = Math.max(dp[i], ans);
}
return ans;
}
}