动态规划-逆向

本题主要考虑倒过来的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;
}
相关推荐
C^h6 小时前
c++ string
开发语言·c++
sbjdhjd6 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
raindayinrain7 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的7 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao7 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
小徐不徐说8 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的8 小时前
C++第一节课
开发语言·c++
UIU1148 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场9 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi9 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构