给出一个长度为 nn 的由正整数构成的序列,你需要从中删除一个正整数,很显然你有很多种删除方式,你需要对删除这个正整数以后的序列求其最长上升子串,请问在所有删除方案中,最长的上升子串长度是多少。
这里给出最长上升子串的定义:即对于序列中连续的若干个正整数,满足 ai+1>aiai+1>ai,则称这连续的若干个整数构成的子串为上升子串,在所有的上升子串中,长度最长的称为最长上升子串。

输入格式

输入第一行仅包含一个正整数 nn,表示给出的序列的长度。
接下来一行有 nn 个正整数,即这个序列,中间用空格隔开。

输出格式

输出仅包含一个正整数,即删除一个数字之后的最长上升子串长度。

数据范围

1≤n≤1051≤n≤105,
1≤ai≤1051≤ai≤105

输入样例:

5 2 1 3 2 5

输出样例:

3


  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int N = 100010;
  6. int a[N], f[N], g[N];
  7. int n;
  8. int main() {
  9. cin >> n;
  10. for (int i = 1; i <= n; ++i) cin >> a[i];
  11. //f[i] 以a[i]结尾的最大上升字串长度
  12. for (int i = 1; i <= n; ++i) {
  13. if (a[i] > a[i - 1]) f[i] = f[i - 1] + 1;
  14. else f[i] = 1;
  15. }
  16. //g[i] 以a[i]开始的最大上升子串长度
  17. for (int i = n; i; --i) {
  18. if (a[i + 1] > a[i]) g[i] = g[i + 1] + 1;
  19. else g[i] = 1;
  20. }
  21. int res = 0;
  22. for (int i = 1; i <= n; ++i) {
  23. if (a[i - 1] >= a[i + 1]) res = max(res, max(f[i - 1], g[i + 1]));
  24. else res = max(res, f[i - 1] + g[i + 1]);
  25. }
  26. cout << res << endl;
  27. return 0;
  28. }