我正在编写代码以计算最长公共子序列的长度。
有人可以向我解释为什么当用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];
}
};