题解 | 合唱队

动态规划寻找最长递增子序列的长度

#include<bits/stdc++.h>

using i128 = __int128;
using i64 = long long;
#define endl '\n'
#define pii std::pair<int ,int>
#define fix(x) std::fixed << std::setprecision(x)
const i64 inf = 1e17 + 50, MAX_N = 1e5 + 50, mod = 1e9 + 7;
std::mt19937_64 rng(std::chrono::system_clock::now().time_since_epoch().count());

void solve() {
	int n;
	std::cin >> n;
	std::vector<int> a(n);
	for(int i = 0; i < n; i++) std::cin >> a[i];
	std::vector<int> p(n, 1), s(n, 1);
  //预处理第l位的最长递增子序列的长度
	for(int l = 0; l < n; l++) {
		for(int r = 0; r < l; r++) {
			if (a[r] < a[l]) {
				p[l] = std::max(p[l], p[r] + 1);
			}
		}
	}
  //倒序处理最长递增子序列长度
	for(int l = n - 1; l >= 0; l--) {
		for(int r = n - 1; r > l; r--) {
			if (a[r] < a[l]) {
				s[l] = std::max(s[l], s[r] + 1);
			}
		}
	}
	int ans = 10 * n;
	for(int i = 1; i < n - 1; i++) {
	  //对于第i位,正向递增和反向递增之和就为总共有多少个但是多加了个第i位所以要减1
		ans = std::min(ans, n - (p[i] + s[i] - 1));
	}

	std::cout << ans << endl;
}

signed main() {
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr), std::cout.tie(nullptr);
	solve();
	return 0;
}


全部评论

相关推荐

09-12 11:55
已编辑
湖南工商大学 Java
那一天的Java_J...:这种一堆问题的,别去
点赞 评论 收藏
分享
牛客37185681...:马德,我感觉这是我面过最恶心的公司,一面是两个女hr,说什么实习前几个月属于试用期,试用期过了才能转成正式实习生,我***笑了,问待遇就是不说,问能不能接受全栈,沙币公司
如果可以选,你最想去哪家...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务