【Java】Leetcode1626 无矛盾的最佳球队

该博客介绍了一种解决竞赛团队组建问题的算法。通过排序球员的年龄和分数,然后使用动态规划找到无矛盾球队的最大得分。算法首先按年龄升序排序球员,接着构建一个动态规划数组,存储在考虑当前球员时能得到的最大分数。通过比较当前球员与之前球员的得分,更新dp数组,并在过程中寻找最大得分。最终返回最高得分。
摘要由CSDN通过智能技术生成

题目:

  1. 无矛盾的最佳球队
    假设你是球队的经理。对于即将到来的锦标赛,你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。

然而,球队中的矛盾会限制球员的发挥,所以必须选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名年龄较大的球员,则存在矛盾。同龄球员之间不会发生矛盾。

给你两个列表 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];
            }
        });
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值