题目来源
题目描述
题目解析
由于球员在数组中的下标不重要,所以可以按照分数或者年龄排序。这里按照分数从小到大排序,分数相同的按照年龄从小到大排序。
因此,问题转换位,从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
}