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;

}
相关推荐
Magic--4 分钟前
选择排序:原理、实现与优化
数据结构·算法·排序算法
TTTrees5 分钟前
C++学习笔记(32):智能指针(weak_ptr)
c++
qq_417695057 分钟前
基于C++的区块链实现
开发语言·c++·算法
We་ct9 分钟前
LeetCode 74. 搜索二维矩阵:两种高效解题思路
前端·算法·leetcode·矩阵·typescript·二分查找
2401_8942419210 分钟前
基于C++的反射机制探索
开发语言·c++·算法
cui_ruicheng13 分钟前
C++ 数据结构进阶:unordered_map 与 unordered_set源码分析与实现
数据结构·c++·算法·哈希算法
天赐学c语言15 分钟前
Linux - 网络应用层协议HTTP
linux·c++·网络服务
C蔡博士18 分钟前
最小生成树(MST)详解:定义、算法与核心性质
算法·贪心算法·图论·时间复杂度
wWYy.18 分钟前
STL:map与unordered_map
开发语言·c++·stl
sxtyjty20 分钟前
AtCoder Beginner Contest 450 G题题解
数学·算法·期望