2013-05-11 167 views
0

我已经编写了解决最长公共子序列问题的代码。只需要定义m个X维的二维表。我已经将它定义为一个全局变量,但它抛出了容量超出的错误。LCS的二维阵列表

#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 

不足以作为我想预先定义矢量并使用下标操作符在代码中访问它。

回答

1

是的,你可以只要所有内部载体应该是相同的大小。

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

第一个参数是所述count(多少对象最初应当在vector),第二个参数是用于初始化每个那些的值。在上述情况下,您最终将得到9000个矢量,每个矢量用数字23的9000倍填充。

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

+0

OK.WIthout object name form is allowed – devsaw 2013-05-11 21:57:22

+0

@DamnDev对不起,我不明白。什么样的形式是允许的,哪些对象名称不存在? – pmr 2013-05-11 22:05:36

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

使用

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

创建一个大小m x w的 “载体的载体”。

此操作,因为这两个参数的std ::向量构造的:

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

这需要大小n作为第一个参数,并作为其第二个参数的值val,所以有vector<int>(w)m份,即大小为wvector<int>m副本(默认值为int(),即0)。

参考