题目
题解
动态规划(最长上升子序列)。
将题目抽象成考点很关键。
本质上就是计算最长上升子序列和最长下降子序列中的较长者的长度。
最长下降子序列可以通过将数组逆序、逆序遍历数组的方式或者更改判断条件等方式转化为最长上升子序列的计算。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int f[N][2], a[N], T, n;
int main()
{
cin >> T;
while (T --) {
int ans = 0;
cin >> n;
for (int i = 1;i <= n;i ++) {
cin >> a[i];
f[i][0] = f[i][1] = 1;
for (int j = 1;j < i;j ++) {
if (a[j] > a[i])
f[i][0] = max (f[i][0], f[j][0] + 1);
if (a[j] < a[i])
f[i][1] = max (f[i][1], f[j][1] + 1);
}
ans = max (ans, max (f[i][0], f[i][1]));
}
cout << ans << endl;
}
return 0;
}