文章
124
粉丝
0
获赞
137
访问
8.8k
#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];
...
登录后发布评论
暂无评论,来抢沙发