1.题目
2.求解
第一眼看到毫无头绪,想着要不要暴力求解,因为数据量不大,只有1000。但是仔细想想又有点动规的味道,但是也没用办法用普通的动规,状压的话数据量又太大了(状压因为要用二进制保存当前状态,因此创建的dp数组数量级都是2^n)。
最后想到,如果按照年龄排序后,不就是一个最大上升子序列吗!!!那就非常简单了,sort排序,很简单的状态转移方程就结束了。上代码!
3.代码
struct player{
int age;
int scores;
}p[1005];
int dp[1005];
class Solution {
public:
static bool cmp(player a,player b){
if(a.age!=b.age) return a.age < b.age;
else return a.scores < b.scores;
}
int bestTeamScore(vector<int>& scores, vector<int>& ages) {
int i, j, k;
int n = scores.size();
for(i = 0; i < n; i++){
p[i].age = ages[i];
p[i].scores = scores[i];
}
sort(p, p + n, cmp);
int maxn = 0;
for(i = 0; i < n; i++){
dp[i] = p[i].scores;
for(j = 0; j < i; j++){
if(p[i].scores >= p[j].scores) dp[i] = max(dp[i], dp[j] + p[i].scores);
}
maxn = max(maxn, dp[i]);
}
return maxn;
}
};