动态规划-逆向

本题主要考虑倒过来的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;
}
相关推荐
dyxal4 分钟前
最长公共子序列(LCS)
python·算法
ShineWinsu1 小时前
对于Linux:模版方法类的解析以及socket、TcpSocket的封装
linux·c++·面试·socket·模板方法模式·封装·tcpsocket
殷忆枫2 小时前
AI笔记三十七:AI边缘端道桥安全监测系统:YOLOv8n推理与Web监控全解析
笔记·yolo
稚南城才子,乌衣巷风流2 小时前
ST 表(Sparse Table)算法详解:原理、实现与应用
算法
hold?fish:palm2 小时前
9 找到字符串中所有字母异位词
c++·算法·leetcode
逸模3 小时前
轻加盟模式,稳住品牌统一调性的思路
笔记·建模·公装·翻模·交底
Sw1zzle3 小时前
算法入门(六):贪心算法 - 基础入门(Leetcode 121/455/860/376/738)
算法·leetcode·贪心算法
青山木3 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b3 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
whyTeaFo3 小时前
GAMES101: Lecture 10: Geometry 1 (Introduction) ppt笔记
笔记