範例程式碼 uva10534
//uva10534
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int LIS(vector<int>& s, vector<int>& pos) { // s Ӫ sequence
if (s.size() == 0) return 0; // oP_ special case
vector<int> v;
vector<int>::iterator p;
pos.clear();
v.push_back(s[0]); // J@ӼƦrAKo v.back() X
pos.push_back(1);
for (int i = 1; i < s.size(); ++i) {
int n = s[i];
if (n > v.back()) {
v.push_back(n);
pos.push_back(v.size());
}
else {
p = lower_bound(v.begin(), v.end(), n);
*p = n;
pos.push_back(p - v.begin() + 1);
}
}
return v.size();
}
int main() {
int n, x;
vector<int> in, rin, prefix, suffix;
while(cin >> n) {
in.clear();
rin.clear();
prefix.clear();
suffix.clear();
for(int i = 0; i < n; i++) {
cin >> x;
in.push_back(x);
}
vector<int>::reverse_iterator rit;
for(rit = in.rbegin(); rit != in.rend(); rit++)
rin.push_back(*rit);
LIS(in, prefix);
LIS(rin, suffix);
vector<int>::iterator p;
vector<int>::reverse_iterator q;
int Max = 0;
for(p = prefix.begin(), q = suffix.rbegin(); p != prefix.end(); p++, q++) {
int tmp = min(*p, *q);
if(tmp > Max)
Max = tmp;
}
cout << Max * 2 - 1 << endl;
/* show detail */
/*cout << " input: ";
for(p = in.begin(); p != in.end(); p++)
cout << *p << " ";
cout << endl;
cout << " Along: ";
for(p = prefix.begin(); p != prefix.end(); p++)
cout << *p << " ";
cout << endl;
cout << "Reverse: ";
for(q = suffix.rbegin(); q != suffix.rend(); q++)
cout << *q << " ";
cout << endl;*/
}
return 0;
}