我已编写代码来解决最长公共子序列问题。只需要定义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
是不够的,因为我想预先定义向量并使用代码中的下标运算符来访问它。
答案 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的完整列表。