求最长公共子序列的空间优化。

我们在求最长公共子序列时一般方法是c(i,j) = c(i-1,j-1) if s1[i] = s2[j] or max(c[i-1][j],c[i][j-1]) if s1[i] != s2[j].

这样,空间复杂度是o(M*N),对此,我们可以做一下优化:

注意到,在求c(i,j)时,只用到了c(i-1,j)和c(i,j-1),所以可以用滚动数组来优化,具体实现又极其简单: 

对于s1[N]和s2[M]

开数组 table[2][M];

for(int i=0;i<N;i++){
        for(int j=0;j<M;j++)
            if(s1[i]==s2[j])
                table[now][j+1] = table[!now][j]+1;
            else
                table[now][j+1] = max(table[now][j],table[!now][j+1]);
      now = !now;

}

而table[!now][M]就是最终的结果。
例如:

s1[5] = { a,b,c,d,e }

s2[5] = { b,d,a,a,a }

table[now][2] = max(table[!now][j+1](s1到a(s1[0]),s2到d(s2[1])),table[now][j](s1到b(s1[1]),s2到b(s2[1]))

你可能感兴趣的:(c,优化,table,ini)