思路
因为要删除一个子数列,那么就设i为删除子序列的右端点,j为左端点,然后枚举i和j,不断往左右延伸,记录每次得到的最大长度即可。
代码
#include <stdio.h>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> v;
int llength = 1;//llength来存储从j往左延伸的最大连续子数列的长度
int rlength = 1;//rlength存储从i向右延伸的最大连续子数列的长度
void left(int j) {//获得从j往左延伸的最大连续子数列的长度
if (j >= 1 && v[j - 1] < v[j])
{
llength++;
left(j-1);
}
else
{
return;
}
}
void right(int i) {//获得从i向右延伸的最大连续子数列的长度
if (i <= v.size() - 2 && v[i + 1] > v[i])
{
rlength++;
right(i+1);
}
else
{
return;
}
}
int main(void) {
int n;
cin >> n;
while (n--) {
int m;
cin >> m;
v.push_back(m);
}
int max = 0;//max来存储最大连续子数列的长度
for (int i = 0; i < v.size(); i++) {
for (int j = i - 1; j >= 0; j--) {
llength = rlength = 1;//都设置为1,因为只要i和j在数组里,就至少有一个单位的长度
if (v[i] > v[j])
{
left(j);
right(i);
if (max < llength+rlength)
max = llength + rlength;
}
}
}
cout << max;
system("pause");
}