动态规划-逆向

本题主要考虑倒过来的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;
}
相关推荐
重生之后端学习15 小时前
287. 寻找重复数
数据结构·算法·leetcode·深度优先·图论
抓个马尾女孩15 小时前
位置编码:绝对位置编码、相对位置编码、旋转位置编码
人工智能·深度学习·算法·transformer
今儿敲了吗16 小时前
46| FBI树
数据结构·c++·笔记·学习·算法
小辉同志16 小时前
139. 单词拆分
算法·动态规划
oem11016 小时前
C++中的访问者模式变体
开发语言·c++·算法
苦瓜小生16 小时前
【黑马点评学习笔记 | 实战篇 】| 6-Redis消息队列
redis·笔记·后端
IronMurphy16 小时前
【算法二十七】230. 二叉搜索树中第 K 小的元素 199. 二叉树的右视图
算法·深度优先
暮冬-  Gentle°16 小时前
C++中的工厂方法模式
开发语言·c++·算法
沐硕16 小时前
《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》
java·python·算法·fastapi·多目标优化·饮食推荐·改进协同过滤
Z9fish16 小时前
sse哈工大C语言编程练习47
c语言·数据结构·算法