zoukankan      html  css  js  c++  java
  • LCIS 最长公共上升子序列

    这个博客好久没写了,这几天为了准备清华交叉研究院的夏令营,在复习大一大二ACM训练时的一些基础算法,正好碰到LICS,发现没有写在博客里,那就顺便记录一下好了。

    参考链接:http://blog.csdn.net/operator456/article/details/8539169

    用一个二维数组f[i][j]表示a序列的前i项,b序列的前j项,并且以b[j]结束的LCIS的长度。

    当a[i] != b[j]时,f[i][j]=f[i-1][j];  //如果最后一项不等,那么f[i][j]必定与f[i-1][j]或者f[i][j-1]相等,因为这里以b[j]表示结束,所以选取f[i][j]=f[i-1][j]。

    当a[i] == b[j]时,f[i][j]=max(f[i-1][k])+1,1<=k<=j-1 && b[j]>b[k]; //求f[i-1]行中的最长,并且保证新增的数大于已经有的数

    下面给出的代码采用了滚动数组

    int f[N];
    int LCIS(int a[],int b[],int lena,int lenb)
    {
    /*
    下面很奇妙之处在于,求f[i-1][k]的时候可以通过一个变量temp来解决。
    当k从1遍历到j的同时,可以不断更新temp的值,
    如果a[i]>b[j]时,令temp=max(temp,f[i-1][j]);
    如果a[i]==b[j]时,令f[i][j]=temp+1。
    因为这里对于内存循环j来说,a[i]是不变的,当a[i]=b[j]时,temp的值就相当于max(f[i-1][k]),1<=k<=j-1 && b[j]>b[k]
    */
     int i,j,temp;
     for(i=1;i<=lena;i++)
     {
      for(j=1,temp=0;j<=lenb;j++)
      {
       if(a[i]>b[j] && f[j]>temp)
        temp=f[j];
       if(a[i]==b[j])
        f[j]=temp+1;
      }
     }
     temp=0;
     for(i=1;i<=lenb;i++)
      if(f[i]>temp)
       temp=f[i];
     return temp;
    }
    View Code
  • 相关阅读:
    POJ 2723 Get Luffy Out(2-SAT)
    ZOJ 3613 Wormhole Transport
    HDU 4085 Peach Blossom Spring
    NBUT 1221 Intermediary
    NBUT 1223 Friends number
    NBUT 1220 SPY
    NBUT 1218 You are my brother
    PAT 1131. Subway Map (30)
    ZSTU OJ 4273 玩具
    ZSTU OJ 4272 最佳淘汰算法
  • 原文地址:https://www.cnblogs.com/chenxiwenruo/p/4508166.html
Copyright © 2011-2022 走看看