DP题,我用<挑战程序设计竞赛>这本书上的最长上升子序列模板(时间复杂度nlogn)的思想做的,具体看代码吧。
代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=2*1e6+10;
const int maxm=3*1e5;
int dp[maxn];
int val[maxm],ans[maxm];
int main()
{
int n;
int tot=0;
while(scanf("%d",&n)==1)
{
if(n<0)
continue;
if(n>=10000)
val[tot]=5,ans[tot]=n-10000;
else
val[tot]=1,ans[tot]=n;
tot++;
}
int len=tot*5+10;
fill(dp,dp+len,INF);
for(int i=0;i<tot;i++)
{
int *p;
p=upper_bound(dp,dp+len,ans[i]);
while(val[i]--)
{
*p=ans[i];
p++;
}
}
printf("%d\n",lower_bound(dp,dp+len,INF)-dp);
}