题目链接:http://acm.tju.edu.cn/toj/showp4153.html
题目很长,但是题意实际上是说……求一个最大上升子序列长度……
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100002;
int a[maxn],dp[maxn];
int main()
{
int n;
while(scanf("%d", &n) !=EOF)
{
memset(dp,0,sizeof(dp));
for(int i=0; i<n; i++) scanf("%d", &a[i]);
dp[0] = a[0];
int len = 0;
for(int i=1; i<n; i++)
if(dp[len] < a[i])
dp[++len] = a[i];
else
{
int pos = upper_bound(dp, dp+len, a[i])-dp;
dp[pos] = a[i];
}
printf("%d\n", len+1);
}
}