leetcode:1626. 无矛盾的最佳球队

题目来源

题目描述

在这里插入图片描述

题目解析

由于球员在数组中的下标不重要,所以可以按照分数或者年龄排序。这里按照分数从小到大排序,分数相同的按照年龄从小到大排序。

因此,问题转换位,从ages中找到一个得分之和最大的递增子序列

我们定义f[i]表示以age[i]结尾的递增子序列的最大得分

func bestTeamScore(scores []int, ages []int) int {

	type member struct {
		Age   int
		Score int
	}
	rank := make([]*member, len(ages))
	for i, _ := range scores{
		rank = append(rank, &member{ages[i], scores[i]})
	}

	sort.Slice(rank, func(i, j int) bool {
		if rank[i].Score < rank[i].Score{
			return true
		}else if rank[i].Score == rank[i].Score &&  rank[i].Age < rank[i].Age{
			return true
		}
		return false
	})

	ans := 0
	dp := make([]int, len(ages))
	for i := 0; i < len(ages); i++ {
		for j := 0; j < i; j++ {
			if rank[j].Age <= rank[j].Age{
				dp[i] = max(dp[i], dp[j])
			}			
		}
		dp[i] += rank[i].Score
		ans = max(ans, dp[i])
	}
	return ans
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值