文章

124

粉丝

0

获赞

137

访问

8.8k

头像
最长递减子序列 题解:
P1836 山东大学机试
发布于2026年2月11日 22:05
阅读数 45

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n; 
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }   
    // dp[i] = 以i结尾的最长递减子序列长度
    vector<int> dp(n, 1);
    // pre[i] = 前一个元素的下标,用于输出路径
    vector<int> pre(n, -1);  
    int maxLen = 1;      // 最长长度
    int maxIdx = 0;      // 最长序列的结尾下标    
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            // 递减:前面的元素 > 当前元素
            if (a[j] > a[i] && dp[j] + 1 > dp[i]) {
                dp[i] = dp[j] + 1;
                pre[i] = j;  // 记录前驱
            }
        }
        // 更新最大值
        if (dp[i] > maxLen) {
            maxLen = dp[i];
            maxIdx = i;
        }
    }    
    // 输出序列(需要倒序,再用栈或数组反转)
    vector<int> ans;
    int cur = maxIdx;
    while (cur != -1) {
        ans.push_back(a[cur]);
        cur = pre[cur];
    ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发