题意:求最长递减子序列的长度。
题目链接:http://www.rqnoj.cn/Problem_167.html
——>>LIS,因为习惯了递增这个方向,于是在输入时从后往前输入,求最长递增子序列。
最坑的地方:一、当N == 0时要特判;
二、当递减子序列最后出现0时,不考虑这些0;(这个坑子坑了我好久……)
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 100000 + 10;
const int INF = 1000000000;
int a[maxn], d[maxn], g[maxn];
int main()
{
int N, i;
while(scanf("%d", &N) == 1)
{
if(!N) printf("0\n");
else
{
int ret = -1;
for(i = N; i >= 1; i--) scanf("%d", &a[i]);
for(i = 1; i <= N; i++) g[i] = INF;
for(i = 1; i <= N; i++)
{
if(a[i] == 0) continue;
int k = lower_bound(g+1, g+1+N, a[i]) - g;
d[i] = k;
g[k] = a[i];
ret = max(ret, k);
}
printf("%d\n", ret);
}
}
return 0;
}