动态规划---最长公共子序列

来源:互联网 发布:大话西游服务端源码 编辑:程序博客网 时间:2024/05/22 05:02


#include <iostream>

#include <string>

#include <cstring>

using namespacestd;

const int maxn =1000;

//memory 可以优化至min(m,n) + o(1)

int num[maxn][maxn];

int res[2][maxn];

int main()

{

    string a,b;

    while (cin >> a >> b) {

        memset(num,0,sizeof(num));

        memset(res,0,sizeof(res));

        int m = a.size(),n = b.size();

        //空间O(m * n)

        for (int i =1; i <= m; i ++) {

            for (int j =1; j <= n; j ++) {

                if (a[i -1] == b[j -1]) {

                    num[i][j] =num[i -1][j -1] +1;

                }

                elsenum[i][j] =max(num[i -1][j],num[i][j -1]);

            }

        }

        //空间优化可至O2 * min(m,n)),以下为O2 * maxm,n))

        int pos =0;

        for (int i =0; i < m ; i ++) {

            for (int j =0; j < n; j ++) {

                if (a[i] == b[j])

                    res[pos][j +1] =res[!pos][j] +1;

                else

                    res[pos][j +1] =max(res[pos][j],res[!pos][j +1]);

                }

            pos = !pos;

        }

        cout <<num[m][n] <<endl;

        cout <<res[!pos][n] <<endl;

        }

    

    return0;

}


0 0
原创粉丝点击