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;

}
相关推荐
GreenTea7 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
码匠许师傅7 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
fqq38 小时前
力扣刷题前置Java语法
算法·leetcode·职场和发展
小小龙学IT9 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
知无不研10 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
2501_9065651210 小时前
数学之美探究
算法
oier_Asad.Chen10 小时前
【洛谷题解/AcWing题解/OI学习笔记】洛谷P2868【USACO07DEC】Sightseeing Cows G(01分数规划求最大比率)
算法·图论·spfa·二分·负环
C++ 老炮儿的技术栈12 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
leisoo809712 小时前
财报数据怎么排雷本地化Python构建财务异常预警系统
人工智能·python·算法
qz_Serene14 小时前
C++:类和对象(上)
开发语言·c++