动态规划寻找最长递增子序列的长度
#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; }