本题主要考虑倒过来的dp;分散的dp,不维护每一个值,维护每一个初始快乐值。
假设后面有89,dp9=1;dp8=2;
如果前面出现7,那么dp7看dp里是否已经有8,有,则等于dp8+1;
如果前面不是7,是5,此时后面没有6,所以5只能自娱自乐,=1
#include <iostream>
#include <vector>
#include <map>
using namespace std;
// 预处理每个评分对应的最大快乐值增量
map<int, int> preprocessHappiness(const vector<int>& scores) {
map<int, int> maxHappiness;
int n = scores.size() - 1; // 有效数据从索引1开始
// 倒序处理每个评分,动态规划计算最大增量
for (int i = n; i >= 1; --i) {
int currentScore = scores[i];
// 如果存在更高一级的评分,则当前评分的增量为更高评分的增量+1
if (maxHappiness.find(currentScore + 1) != maxHappiness.end()) {
maxHappiness[currentScore] = maxHappiness[currentScore + 1] + 1;
} else {
// 否则增量仅为当前评分的一次匹配
maxHappiness[currentScore] = 1;
}
}
return maxHappiness;
}
int main() {
// 优化输入输出效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 读取比赛评分
int n, q;
cin >> n;
vector<int> scores(n + 1); // 索引从1开始
for (int i = 1; i <= n; ++i) {
cin >> scores[i];
}
// 预处理每个评分对应的最大快乐值增量
map<int, int> maxHappiness = preprocessHappiness(scores);
// 处理查询
cin >> q;
while (q--) {
int initialHappiness;
cin >> initialHappiness;
// 输出预处理结果
cout << maxHappiness[initialHappiness] << "\n";
}
return 0;
}