动态规划-逆向

本题主要考虑倒过来的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;
}
相关推荐
北极有牛2 小时前
cpp学习笔记--常量指针
java·开发语言·算法
GPU实战笔记2 小时前
云端 GPU 训练的账户余额提醒:它能说明什么,不能说明什么?
深度学习·算法·成本管理·gpu云计算·云端训练
Titan20243 小时前
MySQL访问个人学习笔记
笔记·学习·mysql
半杯咖啡半行码3 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
浮链序3 小时前
怎么证明"你这个模型是偷我的"——把蒸馏变成取证工具
算法·安全·llm
小O的算法实验室3 小时前
IEEE TMC,面向异构物联网的多目标量子行为拓扑优化算法
算法
liliangcsdn3 小时前
派息率指标的应用探索和分析
大数据·算法
xh didida4 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
垆边人似月.4 小时前
华为机试题 :两数之和
c++·算法·华为
默默开发4 小时前
物流行业可用算法方向
算法