自己瞎琢磨的,我的想法是从往后走,既然可以求最长上升子序列,能不能最长不上升子序列能不能一起求呢?
所以有了下面的代码~
原题链接 acwing 1017
#include <iostream>
using namespace std;
const int N = 110;
int f[N], l[N]; //f数组里面存的是最长不上升子序列,l数组里面存的是最长上升子序列。
int a[N];
int main()
{
int t;
cin >> t;
while (t -- )
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
fill(f+1, f+1+n, 0);
fill(l+1, l+1+n, 0);
for (int i = 1; i <= n; i ++ ) //从前向后下降序列
{
f[i] = l[i] = 1;
for (int j = 1; j < i; j ++ )
if (a[j] > a[i]) f[i] = max(f[i], f[j]+1);
else if (a[j] < a[i]) l[i] = max(l[i], l[j]+1);
}
int res = 0;
for (int i = 1; i <= n; i ++ )
res = max(res, max(l[i], f[i])); //最后对两者取一个最大值~
cout << res << endl;
}
return 0;
}