0

我已经编写了解决最长公共子序列问题的代码。只需要定义 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]);
}

我正在考虑使用向量的向量,但是是否可以同时将大小定义为 mxw ?一个正常的

vector < vector <int> > lcs

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

4

3 回答 3

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),即size的m副本(默认值为0)。vector<int>wint()

参考资料

于 2013-05-11T21:45:20.220 回答
2
std::vector< std::vector<int> > lcs( m, std::vector<int>( w ) );
于 2013-05-11T21:44:47.883 回答
1

是的,只要所有内部向量的大小相同,您就可以。

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

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

vector构造函数的完整列表在这里

于 2013-05-11T21:46:02.040 回答