区间dp,显然二次循环
代码如下
#include <iostream>
#include <queue>
#include <iomanip>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <set>
#include <sstream>
#include <cstring>
using namespace std;
int nums[100001];
int dp[100001];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&nums[i]);
}
int len=0;
for(int i=1;i<=n;i++)
{
if(!len||(nums[i]>dp[len]))
dp[++len]=nums[i];
else
{
int ll=1;
int rr=len;
int mid;
while(ll<rr)
{
mid=(ll+rr)/2;
if(nums[i]>dp[mid])
{
ll=mid+1;
}
else if(nums[i]<dp[mid])
{
rr=mid;
}
else
break;
}
dp[ll]=min(nums[i],dp[ll]);
}
}
printf("%d\n",len);
}
return 0;
}会超时的,引入一个栈,复杂度为n*log(n)。