首页 > 代码库 > hdu 5087 Revenge of LIS II(LIS)
hdu 5087 Revenge of LIS II(LIS)
题目连接: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;
}
hdu 5087 Revenge of LIS II(LIS)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。