49
49
50
50
<!-- 这里可写通用的实现逻辑 -->
51
51
52
- 动态规划 - 最长上升子序列模型。
52
+ ** 方法一: 动态规划**
53
53
54
- 将所有球员先按照年龄从小到大排序(年龄相同,则按照分数从小到大排),然后在分数数组中求解最长上升子序列和的最大值即可。
54
+ 最长上升子序列模型。
55
+
56
+ 将所有球员先按照年龄从小到大排序(年龄相同,则按照分数从小到大排),然后在分数数组中求解最长上升子序列和的最大值即可。最长上升子序列朴素做法,时间复杂度 O(n²)。
55
57
56
58
类似题型:洛谷 “[ P2782 友好城市] ( https://www.luogu.com.cn/problem/P2782 ) ”。
57
59
64
66
``` python
65
67
class Solution :
66
68
def bestTeamScore (self , scores : List[int ], ages : List[int ]) -> int :
67
- nums = list (zip (scores, ages ))
68
- nums.sort(key = lambda x : (x[ 1 ], x[ 0 ]) )
69
- dp = [num[ 0 ] for num in nums]
70
- res, n = 0 , len (ages)
69
+ nums = list (zip (ages, scores ))
70
+ nums.sort()
71
+ n = len ( nums)
72
+ dp = [num[ 1 ] for num in nums]
71
73
for i in range (n):
72
74
for j in range (i):
73
- if nums[j][0 ] <= nums[i][0 ]:
74
- dp[i] = max (dp[i], dp[j] + nums[i][0 ])
75
- res = max (res, dp[i])
76
- return res
75
+ if nums[i][1 ] >= nums[j][1 ]:
76
+ dp[i] = max (dp[i], dp[j] + nums[i][1 ])
77
+ return max (dp)
77
78
```
78
79
79
80
### ** Java**
@@ -86,23 +87,23 @@ class Solution {
86
87
int n = ages. length;
87
88
int [][] nums = new int [n][2 ];
88
89
for (int i = 0 ; i < n; ++ i) {
89
- nums[i] = new int []{scores [i], ages [i]};
90
+ nums[i] = new int []{ages [i], scores [i]};
90
91
}
91
92
Arrays . sort(nums, (a, b) - > {
92
- return a[1 ] == b[1 ] ? a[0 ] - b[0 ] : a[1 ] - b[1 ];
93
+ return a[0 ] == b[0 ] ? a[1 ] - b[1 ] : a[0 ] - b[0 ];
93
94
});
94
95
int [] dp = new int [n];
95
- int res = 0 ;
96
+ int ans = 0 ;
96
97
for (int i = 0 ; i < n; ++ i) {
97
- dp[i] = nums[i][0 ];
98
+ dp[i] = nums[i][1 ];
98
99
for (int j = 0 ; j < i; ++ j) {
99
- if (nums[j][ 0 ] < = nums[i][ 0 ]) {
100
- dp[i] = Math . max(dp[i], dp[j] + nums[i][0 ]);
100
+ if (nums[i][ 1 ] > = nums[j][ 1 ]) {
101
+ dp[i] = Math . max(dp[i], dp[j] + nums[i][1 ]);
101
102
}
102
103
}
103
- res = Math . max(res , dp[i]);
104
+ ans = Math . max(ans , dp[i]);
104
105
}
105
- return res ;
106
+ return ans ;
106
107
}
107
108
}
108
109
```
@@ -112,26 +113,22 @@ class Solution {
112
113
``` cpp
113
114
class Solution {
114
115
public:
115
- int bestTeamScore(vector<int > &scores, vector<int > &ages) {
116
- vector<pair<int, int>> nums;
116
+ int bestTeamScore(vector<int >& scores, vector<int >& ages) {
117
117
int n = ages.size();
118
- for (int i = 0; i < n; ++i) nums.push_back({scores[ i] , ages[ i] });
119
- sort(nums.begin(), nums.end(), [ ] (auto &a, auto &b) {
120
- return a.second == b.second ? a.first < b.first : a.second < b.second;
121
- });
118
+ vector<vector<int >> nums(n);
119
+ for (int i = 0; i < n; ++i) nums[ i] = {ages[ i] , scores[ i] };
120
+ sort(nums.begin(), nums.end());
122
121
vector<int > dp(n);
123
- int res = 0;
124
122
for (int i = 0; i < n; ++i)
125
123
{
126
- dp[ i] = nums[ i] .first ;
124
+ dp[ i] = nums[ i] [ 1 ] ;
127
125
for (int j = 0; j < i; ++j)
128
126
{
129
- if (nums[ j ] .first < = nums[ i ] .first )
130
- dp[ i] = max(dp[ i] , dp[ j] + nums[ i] .first );
127
+ if (nums[ i ] [ 1 ] > = nums[ j ] [ 1 ] )
128
+ dp[ i] = max(dp[ i] , dp[ j] + nums[ i] [ 1 ] );
131
129
}
132
- res = max(res, dp[ i] );
133
130
}
134
- return res ;
131
+ return * max_element(dp.begin(), dp.end()) ;
135
132
}
136
133
};
137
134
```
@@ -141,28 +138,28 @@ public:
141
138
```go
142
139
func bestTeamScore(scores []int, ages []int) int {
143
140
n := len(ages)
144
- var nums [][]int
145
- for i := 0; i < n; i++ {
146
- nums = append(nums, []int{scores[i], ages [i]})
141
+ nums := make( [][]int, n)
142
+ for i, age := range ages {
143
+ nums[i] = []int{age, scores [i]}
147
144
}
148
145
sort.Slice(nums, func(i, j int) bool {
149
- if nums[i][1] == nums[j][1 ] {
146
+ if nums[i][0] != nums[j][0 ] {
150
147
return nums[i][0] < nums[j][0]
151
148
}
152
149
return nums[i][1] < nums[j][1]
153
150
})
154
151
dp := make([]int, n)
155
- res := 0
156
- for i := 0; i < n; i++ {
157
- dp[i] = nums[i][0 ]
152
+ ans := 0
153
+ for i, num := range nums {
154
+ dp[i] = num[1 ]
158
155
for j := 0; j < i; j++ {
159
- if nums[j][0] < = nums[i][0 ] {
160
- dp[i] = max(dp[i], dp[j]+nums[i][0 ])
156
+ if num[1] > = nums[j][1 ] {
157
+ dp[i] = max(dp[i], dp[j]+num[1 ])
161
158
}
162
159
}
163
- res = max(res , dp[i])
160
+ ans = max(ans , dp[i])
164
161
}
165
- return res
162
+ return ans
166
163
}
167
164
168
165
func max(a, b int) int {
@@ -173,6 +170,33 @@ func max(a, b int) int {
173
170
}
174
171
```
175
172
173
+ ### ** JavaScript**
174
+
175
+ ``` js
176
+ /**
177
+ * @param {number[]} scores
178
+ * @param {number[]} ages
179
+ * @return {number}
180
+ */
181
+ var bestTeamScore = function (scores , ages ) {
182
+ const nums = ages .map ((age , i ) => [age, scores[i]]);
183
+ nums .sort ((a , b ) => (a[0 ] == b[0 ] ? a[1 ] - b[1 ] : a[0 ] - b[0 ]));
184
+ const n = nums .length ;
185
+ let dp = new Array (n);
186
+ let ans = 0 ;
187
+ for (let i = 0 ; i < n; ++ i) {
188
+ dp[i] = nums[i][1 ];
189
+ for (let j = 0 ; j < i; ++ j) {
190
+ if (nums[i][1 ] >= nums[j][1 ]) {
191
+ dp[i] = Math .max (dp[i], dp[j] + nums[i][1 ]);
192
+ }
193
+ }
194
+ ans = Math .max (ans, dp[i]);
195
+ }
196
+ return ans;
197
+ };
198
+ ```
199
+
176
200
### ** ...**
177
201
178
202
```
0 commit comments