解题思路:其实就是不断地求LIS,然后把LIS中的元素给去掉,然后再做。直到LIS中的元素个数减少为止。其中用到了二分搜索,做一次LIS的复杂度为(Onlogn)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int s[5000],fg[5000],dp[5000],n;
void solve()
{
int x,r,tp,cnt=0,l,k;
while(1)
{
cnt++;
fill(dp,dp+n,inf);
k=0;
for(int i=0;i<n;i++)
{
if(fg[i]) continue;
*lower_bound(dp,dp+n,s[i])=s[i];
tp=lower_bound(dp,dp+n,inf)-dp;
if(tp>k)
{
k=tp;
fg[i]=1;
}
}
if(cnt==1)
{
l=lower_bound(dp,dp+n,inf)-dp;
}else
{
if((lower_bound(dp,dp+n,inf)-dp)<l)
break;
}
}
printf("%d\n%d\n",l,cnt-1);
}
int main()
{
//freopen("t.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(fg,0,sizeof(fg));
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
}
solve();
}
return 0;
}