最长公共上升子序列 (dp)

来源:互联网 发布:手机淘宝抢购软件 编辑:程序博客网 时间:2024/05/01 04:34

http://wenku.baidu.com/view/3e78f223aaea998fcc220ea0.html

 

 

(1)f[i][j] 表示 a的前i,和b串前 j,以b[j]结尾的LCIS的长度;

if(a[i]!=b[j) f[i][j]=f[i-1][j];

else       f[i][j]=max(f[i-1][k]+1) 1<=k<j&&b[k]<b[j];

 

O(n^3)的复杂度,因为多了一维k,但f[i-1][k]的最大值显然可以在处理i-1的时候求出来

for(i=1;i<=n;i++)

     maxn=0;

          for(j=1;j<=m;j++)

               f[i][j]=f[i-1][j];

               if(a[i]>b[j]&&maxn<f[i-1][j])  maxn=f[i-1][j];

               if(a[i]==b[j])    f[i][j]=maxn+1;

 

 

最后扫一遍f[n][1......m] ,取最大值。

 

(2)压缩空间,时间不变:

       用f[j]表示 所有的a[i]和b的前j个,以b[j]结尾的LCIS的长度。

     注意到(1)中,  if(a[i]>b[j]&&maxn<f[i-1][j])  maxn=f[i-1][j];  我们取得其实是f[1..i-1][j]的最大值,那不就是f[j]吗?

 

   int f[N];

   int a[M],b[N];

   memset(f,0,sizeof(f));

   for(i=1;i<=M;i++)

        maxn=0;

        for(j=1;j<=N;j++)

              if(a[i]>b[j]&&maxn<f[j]) maxn=f[j];

              if(a[i]==b[j])   f[j]=maxn+1;

 

最后扫一遍f[1......N];

 

 

原创粉丝点击