思路:
问题等价于找一个最长非降子序列。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100005
using namespace std;
int n,m,ans,cnt;
int a[maxn],dp[maxn];
void solve()
{
int i,j,pos;
dp[0]=0;
cnt=0;
for(i=1; i<=n; i++)
{
if(a[i]>=dp[cnt]) dp[++cnt]=a[i];
else
{
pos=upper_bound(dp,dp+cnt+1,a[i])-dp; // 找到>a[i]的第一次出现的位置
printf("i:%d pos:%d\n",i,pos);
dp[pos]=a[i];
}
}
}
int main()
{
int i,j;
while(~scanf("%d",&n))
{
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
solve();
printf("%d\n",cnt); // 长度即为cnt 但序列不是dp保存的序列 要输出序列的话应在更新ant时记录序列
}
return 0;
}
/*
7
2 3 3 5 3 2 4
*/