C++ 最长单调子序列

最长单调子序列 代码框架 代码见下

cpp 复制代码
#include<iostream>
using namespace std;

#define maxn 5010
int a[maxn];
// 模版为最长递增子序列
// 如果要改成单调不降呢 a[i] <= g[mid] 改为 a[i] < g[mid]
int getLTS(int n, int a[], int dp[]) {
	int g[maxn], gSize = 0;
	for (int i = 0; i < n; ++i) {
		int l = -1, r = gSize;
		while (l + 1 < r) {
			int mid = (l + r) >> 1;
			if (a[i] <= g[mid]) {
				r = mid;
			}
			else {
				l = mid;
			}
		}
		if (r == gSize) {
			g[gSize++] = a[i];
		}
		else {
			g[r] = a[i];
		}
		dp[i] = gSize;
	}
	return gSize;
}

int dp[maxn];

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}
	cout << getLTS(n, a, dp) << endl;
	return 0;
}

代码练习 1 对应蓝桥云课 蓝桥骑士 代码见下

cpp 复制代码
#include<iostream>
using namespace std;

#define maxn 300010
int a[maxn];
// 模版为最长递增子序列
// 如果要改成单调不降呢 a[i] <= g[mid] 改为 a[i] < g[mid]
int getLTS(int n, int a[], int dp[]) {
	int g[maxn], gSize = 0;
	for (int i = 0; i < n; ++i) {
		int l = -1, r = gSize;
		while (l + 1 < r) {
			int mid = (l + r) >> 1;
			if (a[i] <= g[mid]) {
				r = mid;
			}
			else {
				l = mid;
			}
		}
		if (r == gSize) {
			g[gSize++] = a[i];
		}
		else {
			g[r] = a[i];
		}
		dp[i] = gSize;
	}
	return gSize;
}

int dp[maxn];

int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; ++i) {
		cin >> a[i];
	}
	cout << getLTS(n, a, dp) << endl;
	return 0;
}

代码练习 2 对应蓝桥云课 合唱队形 代码见下

cpp 复制代码
#include<iostream>
using namespace std;

#define maxn 110
int a[maxn];
// 模版为最长递增子序列
// 如果要改成单调不降呢 a[i] <= g[mid] 改为 a[i] < g[mid]
int getLTS(int n, int a[], int dp[]) {
	int g[maxn], gSize = 0;
	for (int i = 0; i < n; ++i) {
		int l = -1, r = gSize;
		while (l + 1 < r) {
			int mid = (l + r) >> 1;
			if (a[i] <= g[mid]) {
				r = mid;
			}
			else {
				l = mid;
			}
		}
		if (r == gSize) {
			g[gSize++] = a[i];
		}
		else {
			g[r] = a[i];
		}
		dp[i] = gSize;
	}
	return gSize;
}

int dp[maxn];

void swap(int n, int a[]){
  for(int i=0; i<n/2; ++i){
    swap(a[i], a[n-1-i]);
  }
}

int dppre[maxn], dppost[maxn];

int main(){
  int n;
  cin >> n;
  for(int i=0; i<n; ++i){
    cin >> a[i];
  }
  getLTS(n, a, dppre);
  swap(n, a);
  getLTS(n, a, dppost);
  swap(n, dppost);
  int ans = 0;
  for(int i=0; i<n; ++i){
    ans = max(ans, dppre[i] + dppost[i] - 1);
  }
  cout << n - ans << endl;
  return 0;

}

代码 3 对应蓝桥云课 拍照 代码见下

cpp 复制代码
#include<iostream>
using namespace std;

#define maxn 110
int a[maxn];
// 模版为最长递增子序列
// 如果要改成单调不降呢 a[i] <= g[mid] 改为 a[i] < g[mid]
int getLTS(int n, int a[], int dp[]) {
	int g[maxn], gSize = 0;
	for (int i = 0; i < n; ++i) {
		int l = -1, r = gSize;
		while (l + 1 < r) {
			int mid = (l + r) >> 1;
			if (a[i] < g[mid]) {
				r = mid;
			}
			else {
				l = mid;
			}
		}
		if (r == gSize) {
			g[gSize++] = a[i];
		}
		else {
			g[r] = a[i];
		}
		dp[i] = gSize;
	}
	return gSize;
}

int dp[maxn];

void swap(int n, int a[]){
  for(int i=0; i<n/2; ++i){
    swap(a[i], a[n-1-i]);
  }
}

int dppre[maxn], dppost[maxn];

int main(){
  int n;
  cin >> n;
  for(int i=0; i<n; ++i){
    cin >> a[i];
  }
  getLTS(n, a, dppre);
  swap(n, a);
  getLTS(n, a, dppost);
  swap(n, dppost);
  int ans = 0;
  for(int i=0; i<n; ++i){
    ans = max(ans, dppre[i] + dppost[i] - 1);
  }
  cout << n - ans << endl;
  return 0;

}
相关推荐
cu14310 分钟前
细谈GM8229的具体功能与其应用
c语言·c++·人工智能·单片机
需要82625 分钟前
分布式 ID 生成:雪花算法、号段模式与时钟回拨
分布式·算法
垆边人似月.32 分钟前
华为机考题:字符串分隔
算法·华为
CQU_JIAKE35 分钟前
9.4【A】
算法
CQU_JIAKE39 分钟前
9.13[A]
算法
懿路向前1 小时前
【唤醒实战笔记】2026-09-29 | 智能体提示词迭代史(v1 → v8)
linux·笔记·算法
qq_406981031 小时前
c++构造函数初始化列表
c++
王老师青少年编程1 小时前
2026年9月GESP真题及题解(C++八级):末班车
c++·题解·真题·gesp·八级·2026年9月·末班车
@陈小鱼1 小时前
基于CNN-Transformer的无袖带血压估计
人工智能·深度学习·神经网络·算法·cnn·transformer·血压
cu1431 小时前
细谈GM7123C的具体功能与其应用
c语言·c++·人工智能·嵌入式硬件