动态规划-逆向

本题主要考虑倒过来的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;
}
相关推荐
IronMurphy1 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬1 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership2 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
码途漫谈2 小时前
Easy-Vibe开发篇阅读笔记(四)——前端开发之结合 Agent Skills 美化界面
人工智能·笔记·ai·开源·ai编程
smj2302_796826522 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u3 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
c++之路4 小时前
C++信号处理
开发语言·c++·信号处理
糖炒栗子03264 小时前
【笔记】高分卫星影像 TIF 切片处理
笔记
Nice_Fold5 小时前
Kubernetes DaemonSet、StatefulSet与Service(自用笔记)
笔记·容器·kubernetes
_深海凉_6 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展