Description
Input
Output
Sample Input
2 5 18 3 4 7 10 9 11 8 15
Sample Output
HINT
Source
題解:
這題……直接dp最長上升子序列。。無聊的我交了單調棧+貪心的nlog……
O(n^2):
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=5001;
int a[MAXN],dp[MAXN];
int main(int argc, char *argv[])
{
int n,m,i,j;
int ans=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
for(j=0;j<i;j++)
if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
return 0;
}
O(nlogn):
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN=5001;
int s[MAXN];
int main(int argc, char *argv[])
{
int n,i,x,l,r,mid;
int top=0;
s[0]=-1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
if(x>s[top]) s[++top]=x;
else
{
l=0,r=top;
while(l<r)
{
mid=(l+r)/2;
if(x<=s[mid]) r=mid;
else l=mid+1;
}
s[l]=x;
}
}
printf("%d\n",top);
return 0;
}