給一個序列,要我們找出前 (n-1) 是升序後面 (n-1)降序的最長子序列長度
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n;
while (cin >> n) {
int a[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int lis[n]; // 紀錄左到右的 lis 位置
int lds[n]; // 紀錄左道揍的 lds 位置
vector<int> dp;
dp.push_back(a[0]);
for (int i = 0; i < n; i++) {
if (a[i] > dp.back()) {
lis[i] = dp.size();
dp.push_back(a[i]);
} else {
dp[lis[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin()] = a[i];
}
}
dp.resize(0);
dp.push_back(a[n - 1]);
for (int i = n - 1; i >= 0; i--) {
if (a[i] > dp.back()) {
lds[i] = dp.size();
dp.push_back(a[i]);
} else {
lds[i] = lower_bound(dp.begin(), dp.end(), a[i]) - dp.begin();
dp[lds[i]] = a[i];
}
}
int ans = 0;
for (int i = 0; i < n; i++) {
ans = max(ans, min(lis[i], lds[i]) * 2 + 1);
}
cout << ans << endl;
}
return 0;
}