码迷,mamicode.com
首页 > 其他好文 > 详细

最长上升子序列

时间:2016-04-02 10:47:08      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:

【题目描述】
一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。
【输入描述】
输入的第一行是序列的长度N (1 <= N <= 1000000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到1000000。
【输出描述】
最长上升子序列的长度。
【样例输入】
7
1 7 3 5 9 4 8
【样例输出】
4

源代码:

#include<cstdio>
int n,s=1,i[200001],h[200001];
int x1(int t1,int t2,int num) //二分查找。
{
    int ans,t=(t1+t2)/2;
    if (t1==t2-1||h[t]==num)
      return t1;
    if (h[t]<num)
      ans=x1(t,t2,num);
    if (h[t]>num)
      ans=x1(t1,t,num);
    return ans;
}
int main()
{
    scanf("%d",&n);
    for (int a=1;a<=n;a++)
      scanf("%d",&i[a]);
    h[1]=i[1]; //长度为1的终点一开始一定为第1个点。
    for (int a=2;a<=n;a++)
      if (h[s]<i[a]) //判断是否有更长的序列。
        h[++s]=i[a];
      else
      {
          int t=x1(1,s,i[a]); //减少时间复杂度的关键。
          h[t+1]=h[t+1]<i[a]?h[t+1]:i[a];
      }
    printf("%d\n",s);
    for (int a=1;a<=s;a++)
      printf("%d ",h[a]); //通过此方法还可以找出序列のmin解。
    return 0;
}

最长上升子序列

标签:

原文地址:http://www.cnblogs.com/Ackermann/p/5347015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!