Bur
Гуру
(4886)
1 неделю назад
Для решения задачи по нахождению наибольшей общей подпоследовательности (НОП) на языке C++, мы можем использовать динамическое программирование. Ниже представлен пример кода, который выполняет эту задачу.
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int N;
cin >> N;
vector<int> sequence1(N);
for (int i = 0; i < N; ++i) {
cin >> sequence1[i];
}
int K;
cin >> K;
vector<int> sequence2(K);
for (int i = 0; i < K; ++i) {
cin >> sequence2[i];
}
// Инициализация таблицы для динамического программирования
vector<vector<int>> dp(N + 1, vector<int>(K + 1, 0));
// Заполнение таблицы
for (int i = 1; i <= N; ++i) {
for (int j = 1; j <= K; ++j) {
if (sequence1[i - 1] == sequence2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
} else {
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
}
// Длина НОП
int lcs_length = dp[N][K];
cout << lcs_length << endl;
// Восстановление НОП
vector<int> lcs;
int i = N, j = K;
while (i > 0 && j > 0) {
if (sequence1[i - 1] == sequence2[j - 1]) {
lcs.push_back(sequence1[i - 1]);
--i; --j;
} else if (dp[i - 1][j] >= dp[i][j - 1]) {
--i;
} else {
--j;
}
}
// Обратный порядок НОП
reverse(lcs.begin(), lcs.end());
// Вывод самой НОП
for (int num : lcs) {
cout << num << " ";
}
cout << endl;
return 0;
}
```
Объяснение кода:
1. Ввод данных: Считываем длины и содержимое двух последовательностей.
2. Таблица DP: Создаем двумерный вектор для хранения длин НОП для каждой подстроки.
3. Заполнение таблицы: Если элементы совпадают, берем значение из предыдущего состояния + 1; если нет, берем максимум из двух возможных вариантов.
4. Длина НОП: Длина находится в правом нижнем углу таблицы.
5. Восстановление НОП: Обходим таблицу с конца к началу, собирая элементы НОП.
6. Вывод результата: Сначала выводим длину НОП, затем саму подпоследовательность.
Скомпилируйте и запустите этот код, введя указанные данные, чтобы получить нужный результат.
В первой строке входного файла записано число N — длина первой последовательности . Во второй строке записаны члены первой последовательности (через пробел) — целые числа, не превосходящие по модулю. В третьей строке записано число K — длина второй последовательности . В четвёртой строке записаны члены второй последовательности (через пробел) — целые числа, не превосходящие по модулю.
Входные данные
3
1 2 3
4
2 1 3 5
Результат работы
2
1 3