题意:求最长递减子序列的长度。
题目链接: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; }
作者:SCNU_Jiechao 发表于2013-5-6 21:21:39 原文链接
阅读:46 评论:0 查看评论