#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 110; const int INF = 2147483640; int n, a[maxn]; int dp[2][maxn], len;//元素个数和nlogn求最长..子序列需要的结构 int f[2][maxn];//储存以第i个元素结尾的最长..子序列的个数,便于枚举 int bin_find(bool tag, int key, int l, int r); int main() { scanf("%d", &n); int i; for(i = 1; i <= n; ++i) scanf("%d", &a[i]); len = 0; dp[0][0] = -INF; for(i = 1; i <= n; ++i) { if(a[i] > dp[0][len]) { dp[0][++len] = a[i]; f[0][i] = len; }l else { int pos = bin_find(0, a[i], 1, len); dp[0][pos] = a[i]; f[0][i] = pos; } } len = 0;//nlogn倒着求最长..子序列 dp[1][0] = -INF; for(i = n; i >= 1; --i) { if(a[i] > dp[1][len]) { dp[1][++len] = a[i]; f[1][i] = len; } else { int pos = bin_find(1, a[i], 1, len); dp[1][pos] = a[i]; f[1][i] = pos; } } int cnt = 0; for(i = 1; i <= n; ++i) { cnt = max(cnt, f[0][i] + f[1][i]); } printf("%d\n", n-cnt+1); return 0; } int bin_find(bool tag, int key, int l, int r) { int mid; while(l <= r) { mid = (l + r)>>1; if(key <= dp[tag][mid]) r = mid - 1; else l = mid + 1; } return r + 1; }
洛谷P1091_分别从两边求最长上升子序列(nlogn)
猜你喜欢
转载自blog.csdn.net/jay__bryant/article/details/80031044
今日推荐
周排行