1 6 5 4 5
比如上面这个序列,在不知道最后一个数是5的前提下,选1 4 比选1 5 好,更比选1 6 好。
比如上面这个序列,在不知道最后一个数是5的前提下,选1 4 比选1 5 好,更比选1 6 好。
#include<cstdio>
#include<cstring>
const int N = 100020;
int dp[N],a[N];
int search(int k,int len)
{
int left,right,m;
left = 1;
right = len;
m = (left + right) >> 1;
while(left <= right)
{
if(k == dp[m])return m;
if(k > dp[m]) left = m + 1; //向右找
if(k < dp[m]) right = m - 1; //向左找
m = (left+right) >> 1;
}
return left;
}
int main()
{
int i, j, len, t, n, m;
while(scanf("%d",&n)!= EOF)
{
for ( i = 0; i < n; i++)
scanf("%d",&a[i]);
dp[1] = a[0]; //无条件选择第一个数
len = 1; //设单调递增最长子序列长度为len,此时len为 1
for (i = 1; i < n; i++) //讨论后面数的影响
{
t = search(a[i],len); //返回a[i]在 dp数组 中的位置
dp[t] = a[i]; //用a[i]覆盖 ,说明t长度的递增序列,最大值是a[i]
if(t > len) len = t; //如果L中数字都比a[i]小,len = t;
}
printf("%d\n",len);
}
return 0;
}