题目:
- 无矛盾的最佳球队
假设你是球队的经理。对于即将到来的锦标赛,你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。
然而,球队中的矛盾会限制球员的发挥,所以必须选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名年龄较大的球员,则存在矛盾。同龄球员之间不会发生矛盾。
给你两个列表 scores 和 ages,其中每组 scores[i] 和 ages[i] 表示第 i 名球员的分数和年龄。请你返回 所有可能的无矛盾球队中得分最高那支的分数 。
示例 1:
输入:scores = [1,3,5,10,15], ages = [1,2,3,4,5]
输出:34
解释:你可以选中所有球员。
思路:
按照年龄从小到大排序数组后(同时处理分数数组)
就是求一个上升子序列的最大值
dp 数组存储取当前值的情况下的最大值
不断判断求 max
tips:
求最大值可以设 dp 数组,数组每个节点代表取了该节点值后能得到的最大值,遍历数组时顺便求最大值
class Solution {
public int bestTeamScore(int[] scores, int[] ages) {
int res = 0;
int[][] people = new int[ages.length][2];
for(int i=0;i<ages.length;i++){
people[i][0] = ages[i];
people[i][1] = scores[i];
}
numSort(people);
int[] dp = new int[people.length];
for(int i=0;i<people.length;i++){
dp[i] = people[i][1];
}
for(int i=0;i<dp.length;i++){
for(int j=0;j<i;j++){
if(people[j][1]<=people[i][1])
dp[i] = Math.max(dp[j]+people[i][1],dp[i]);
}
res = Math.max(res,dp[i]);
}
return res;
}
public static void numSort(int[][] people){
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// 升序排列
return o1[0]==o2[0]?o1[1]-o2[1]:o1[0]-o2[0];
}
});
}
}