题目连接:hdu 5087 Revenge of LIS II
题目大意:给定一个序列,求第2长的LIS长度。
解题思路:用o(n^2)的算法求LIS,每个位置维护两个值,最大和最小即可。注意的是dp[0]中的最大第二大不能都复制成0.
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int N, A[maxn], dp[maxn][2];
void update(int u, int d) {
dp[u][0] = max(dp[u][0], d);
if (dp[u][0] > dp[u][1])
swap(dp[u][0], dp[u][1]);
}
int main () {
int cas;
scanf("%d", &cas);
while (cas--) {
scanf("%d", &N);
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= N; i++)
scanf("%d", &A[i]);
int fans = 0, sans = 0;
dp[0][0] = -maxn;
for (int i = 1; i <= N; i++) {
for (int j = 0; j < i; j++) {
if (A[i] > A[j]) {
update(i, dp[j][0] + 1);
update(i, dp[j][1] + 1);
}
}
for (int j = 0; j < 2; j++) {
sans = max(sans, dp[i][j]);
if (sans > fans)
swap(sans, fans);
}
}
printf("%d\n", sans);
}
return 0;
}