ACM模板——最长上升子序列(LIS)

最长上升子序列(LIS) 更好的方案(经过比赛检测...) 其中lower_bound来自

//最长上升子序列 Longest Increasing Subsequence O(nlogn)
int b[N];
int LIS(int a[], int n) {
  int len = 1; b[0] = a[0];
  for (int i = 1; i < n; i++) {
    b[a[i] > b[len - 1] ? len++ : lower_bound(b, b + len, a[i]) - b] = a[i]; //非降换为>=和upper_bound
  }
  return len;
}


最长上升子序列(LIS) 求长度

#include 
#define  MAXN 1010
int seq[MAXN];
int seqlen[MAXN];
int main()
{
    int N;
    while(scanf("%d",&N)==1)
    {
        int i,j,k,max,maxlen=1;
        for(i=1; i<=N; i++)
            seqlen[i]=1;               //seqlen数组存以第i个数为终点的最长上升序列
        for(i=1; i<=N; i++)
            scanf("%d",&seq[i]);       //seq数组保存序列数组
        for (i=2; i<=N; i++)
        {
            max=0;
            for (j=1; j<=i-1; j++)
            {
                if(seq[j]max)  //在前i-1个序列中,寻找以终点小于seq[i]的最长的子序列,即最优子状态
                    max=seqlen[j];
            }
            seqlen[i]=max+1;
            if(seqlen[i]>maxlen)           //seqlen中保存的是第i个数为终点的最长上升序列,找出这个数组中最大的值即为最优序列长度
                maxlen=seqlen[i];
        }
        printf("%d\n",maxlen);
    }
    return 0;
}

你可能感兴趣的:(ACM模板)