Эта функция должна инициализировать массивы C [m + 1] [n + 1] и B [m] [n] и заполнить первую строку и первый столбец C нулями. Примечание: int *** C относится к указателю, указывающему на двумерный целочисленный массив. Пожалуйста, исправьте ошибку.
void initLCSTable(int*** C, char*** B, int m, int n)
{
C[m + 1][n + 1] = {{0}}; //i don't know if this makes the 1st row & column to 0
for (int row = 0; row < m; row++)
{
for (int col = 0; col < n; col++)
{
C[m][n] = 0;
}
B[m][n];
}
void printLengthTable(int** C, int m, int n);
void printArrowTable(char** B, int m, int n);
//The following function releases the memory space table C & B
occupied
void freeLCSTable(int** C, char** B, int m)
{
// add code here. Please assist me in this function.
}main {
int** C;
char** B;
initLCSTable(&C, &B, m, n);
cout << "\nTable C" << endl;
printLengthTable(C, m, n);
cout << "\nTable B" << endl;
printArrowTable(B, m, n);
return 0;
}//This function print the 2D length array C
//Note: array C has m+1 rows and n+1 column
void printLengthTable(int** C, int m, int n)
{
for (int i = 0; i <= m; i++)
{
for (int j = 0; j <= n; j++)
{
cout << C[i][j] << " ";
}
cout << endl;
}
}
//******************************************
//This function print the 2D arrow array B
//Note: array B has m rows and n column
void printArrowTable(char** B, int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
cout << B[i][j] << " ";
}
cout << endl;
}
}
Вывод должен выглядеть следующим образом (игнорируйте ненулевые значения, так как это совсем другой вопрос о самой длинной подпоследовательности):
Пока вы инициализируете часть массива, остальные будут инициализированы по умолчанию.
C[m + 1][n + 1] = {{0}}; // Zero-initialized
C[m + 1][n + 1] = {0}; // Same ^
C[m + 1][n + 1] = {{1}}; // Zero-intialized except for [0][0] = 1
C[m + 1][n + 1] = {1}; // Same ^
C[m + 1][n + 1]; // Uninitialized!
В некоторых случаях массивы инициализируются нулями в любом случае, но это явно не мешает делать это явно.
Обратите внимание, что если вы хотите инициализировать значениями, отличными от нуля, вам (в основном) не повезет. Я недавно поработал с шаблонным метапрограммированием, которое помогло бы …
// You can subclass this type, add it as a member, etc.
template<class T, T... I> struct Seq {
typedef T value_type [sizeof...(I)];
// If you want to use it directly from here:
static constexpr value_type value = {I...};
// Don't bother trying with any variation of...
// static constexpr value_type to_array(void) { return {I...}; }
};
template<class T, T... I0, T... I1>
auto operator+(Seq<T, I0...> const&, Seq<T, I1...> const&)
-> Seq<T, I0+I1...> { return {}; }
template<class T, T... I0, T... I1>
auto operator<<(Seq<T, I0...> const&, Seq<T, I1...> const&)
-> Seq<T, I0..., I1...> { return {}; }
// ... more Seq manipulation ...
Я могу использовать это для определения диапазонов чисел, биномиальных коэффициентов и т. Д. И до тех пор, пока у меня все еще есть некоторая форма доступа к аргументам шаблона, я могу сделать из него массив. (Это включает в себя перемещение вокруг Seq<...>
как абстрактный T
пока функция, где она используется.) Я хотел бы знать, что еще можно сделать с этим. Я пытался вернуть initializer_list
и определение массива из этого, но не повезло (инициализаторы массива, видимо, только выглядят как initializer_list
с.)
Других решений пока нет …