Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

ПРОШУ ПОМОГИТЕ С С++

Leyla Nuriyeva Ученик (193), открыт 1 неделю назад
Даны две последовательности. Найдите их наибольшую общую подпоследовательность
В первой строке входного файла записано число N — длина первой последовательности . Во второй строке записаны члены первой последовательности (через пробел) — целые числа, не превосходящие по модулю. В третьей строке записано число K — длина второй последовательности . В четвёртой строке записаны члены второй последовательности (через пробел) — целые числа, не превосходящие по модулю.
Входные данные

3
1 2 3
4
2 1 3 5
Результат работы

2
1 3
1 ответ
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. Вывод результата: Сначала выводим длину НОП, затем саму подпоследовательность.

Скомпилируйте и запустите этот код, введя указанные данные, чтобы получить нужный результат.
BurГуру (4886) 1 неделю назад
Похожие вопросы