最长上升子序列nlogn+路径输出

Posted nirvana · rebirth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长上升子序列nlogn+路径输出相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <algorithm>
#include <functional>
#include <string.h>
using namespace std;

typedef long long ll;

const int maxn = 1e5 + 7;
int dp[maxn];
int pos[maxn];	// 记录每个数在dp数组里出现的位置。唯一
int ans[maxn];
int arr[maxn];
int main() {
	memset(dp, 0, sizeof(dp));
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> arr[i];
	}
	dp[1] = arr[0];
	int len = 1;
	for (int i = 1; i < n; ++i) {
		if (arr[i] > dp[len]) {
			dp[++len] = arr[i];
			pos[i] = len;
		}
		else {
			int p = lower_bound(dp + 1, dp + 1 + len, arr[i]) - dp;
			dp[p] = arr[i];
			pos[i] = p;
		}
	}
	int t = len;
	for (int i = n - 1; i >= 0; --i) {
		if (!len)
			break;
		if (pos[i] == len) {
			ans[len] = i;
			--len;
		}
	}
	/*cout << "dp:\\t";
	for (int i = 1; i <= n; ++i) {
		cout << dp[i] << " ";
	}
	cout << endl;
	cout << "pos:\\t";
	for (int i = 0; i < n; ++i) {
		cout << pos[i] << " ";
	}
	cout << endl;*/
	for (int i = 1; i <= t; ++i) {
		cout << arr[ans[i]] << " ";
	}
	return 0;
}

以上是关于最长上升子序列nlogn+路径输出的主要内容,如果未能解决你的问题,请参考以下文章

最长上升子序列(NlogN)总结

300. 最长上升子序列

Leetcode 300.最长上升子序列

LeetCode 300. 最长上升子序列

最长上升子序列问题 nlogn 实现算法的简述

leetcode-300最长上升子序列