LCS的2d数组表

时间:2013-05-11 21:37:59

标签: c++ vector

我已编写代码来解决最长公共子序列问题。只需要定义m X w维度的2D表。我已将其定义为全局变量,但它超出了容量误差。

#define FOR(i,n) for( i = 0; i < n ; ++ i)
int LCS(const char M[],int m, const char W[], int w)
{
    // m length of M w length of W
    int ans,min,i,j;
    // lcs table needs to be defined with required dimensions 
    min = ( m >= w ) ? w : m;

    FOR(i,m)
        FOR(j,w)
        {
            if (i == 0 || j == 0)
                lcs[i][j] = 0; // repetitive
            else if (M[i] == W[j] )
                lcs[i][j] = lcs[i-1][j-1] + 1;
            else
                lcs[i][j] = max(lcs[i-1][j],lcs[i][j-1]);
        }

        return (min == lcs[m-1][w-1]);
}

我正在考虑使用矢量矢量,但是可以同时将尺寸定义为m x w吗?正常

vector < vector <int> > lcs

是不够的,因为我想预先定义向量并使用代码中的下标运算符来访问它。

3 个答案:

答案 0 :(得分:3)

使用

vector<vector<int>> lcs(m, vector<int>(w));

创建一个大小为m x w的“矢量矢量”。

这是因为两个参数std :: vector构造函数:

vector(size_type n, const value_type& val = value_type());

,其大小为n作为其第一个参数,值为val作为其第二个参数,因此m的副本为vector<int>(w),即{{1}大小为m的{​​{1}}副本(默认值为vector<int>,为0)。

参考

答案 1 :(得分:2)

std::vector< std::vector<int> > lcs( m, std::vector<int>( w ) );

答案 2 :(得分:1)

是的,只要所有内部向量都应该具有相同的大小,就可以。

std::vector< std::vector<int> > v(9000, std::vector<int>(9000, 23));

第一个参数是count(最初应该在vector中有多少个对象),第二个参数是用于初始化每个对象的值。在上面的例子中,你最终得到了9000个向量,每个向量填充了数字23的9000倍。

vector构造函数is here的完整列表。