动态二维数组给出错误的结果

时间:2019-02-10 15:03:42

标签: c++ algorithm dynamic-programming dynamic-arrays

我正在编写代码以计算最长公共子序列的长度。

有人可以向我解释为什么当用X = {2,3,4},n = 3和Y = {3,5,3,2,4},m = 5实例化时这两个过程给出不同的结果的原因

代码#1

template<typename T>
int LLCS(T X[], const int& n, T Y[], const int& m){
    array<int>d(n+1,m+1);
    int i,j;
    for(i = 0; i <= m; ++i)d(0,i) = 0;
    for(i = 1; i <= n; ++i){
        d(i,0) = 0;
        for(j = 1; j <= m; ++j)
            if(X[i-1] == Y[j-1])d(i,j) = 1 + d(i-1,j-1);
            else d(i,j) = max(d(i-1,j), d(i,j-1));
    }
    return d(n,m);
}

代码#2

const int N = 10;   //n, m < N-1

template<typename T>
int _LLCS(T X[], const int& n, T Y[], const int& m){
    T d[N][N];
    int i, j;
    for(i = 0; i <= m; ++i)d[0][i] = 0;
    for(i = 1; i <= n; ++i){
        d[i][0] = 0;
        for(j = 1; j <= m; ++j)
            if(X[i-1] == Y[j-1])d[i][j] = 1 + d[i-1][j-1];
            else d[i][j] = max(d[i-1][j], d[i][j-1]);
    }
    return d[n][m];
}

代码#1 的结果为1

代码#2 的结果为2(正确答案)

数组容器的代码

template<typename T>
class array {
private:
    T *root;
    std::size_t _n, _m;
public:
    array(const std::size_t& n) : root(new T[n]), _n(1), _m(1) {}
    array(const std::size_t& n, const std::size_t& m)
         : root(new T[n * m]), _n(m), _m(1) {}

    ~array() { delete[] root; }
    T& operator[](const std::size_t& x) { return root[x]; }
    T& operator()(const std::size_t& x, const std::size_t& y){
        return root[_n * x + y];
    }
};

0 个答案:

没有答案