时间复杂度O(n^2*logn),不过常数好像不小
这里需要先“登山”,然后“下山”
所有会有两段LIS,并且N是1e3,所以可以进行枚举。
枚举每个点作为登山的“顶点”,然后对两段分别进行求LIS即可
这里要判断一下两端LIS所求得的最高点是否一样,如果一样那么这时候可以到达的数目就要-1
答案取每次枚举得得到的最大值即可
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e3 + 17;
int a[N], b[N];
int f(int l, int r, int& largest){
if(l == r) return 1;
if(l > r) return 0;
int k = 0;
b[++k] = a[l];
for(int i = l + 1; i < r; ++i){
int pos = lower_bound(b + 1, b + k + 1, a[i]) - b;
if (pos == k + 1) b[++k] = a[i];
else {
if (b[pos - 1] < a[i])
b[pos] = min(b[pos], a[i]);
}
}
largest = b[k];
return k;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
int ans = 0;
for(int i = 0; i < n; ++i){
int g1, g2;
int temp = f(0, i + 1, g1);
reverse(a + i + 1, a + n);
temp += f(i + 1, n, g2);
if(g1 == g2) temp--;
reverse(a + i + 1, a + n);
ans = max(ans, temp);
}
cout << ans;
return 0;
}