Незнайка C++ wants to find the longest subsequence of a given sequence of integers, the sum of whose elements

Незнайка C++ wants to find the longest subsequence of a given sequence of integers, the sum of whose elements is divisible by 3. He asked you to write a program that:
• reads the sequence of integers from the keyboard;
• calculates the length of the longest subsequence, the sum of whose elements is divisible by 3;
• displays the result on the screen.

Input:
The first line of input consists of a single integer n (1 ≤ n ≤ 1). Each of the following n lines contains one element of the sequence 0 ≤ ai ≤ 2 (i = 1..n).

Output:
Display the length of the longest subsequence found on the screen.
Markiz

Markiz

Хорошо, чтобы решить данную задачу, мы можем использовать метод, называемый динамическим программированием.

Давайте разберем каждый шаг данного алгоритма:

1. Сначала нам нужно прочитать количество элементов n из ввода.
2. Затем мы будем считывать n элементов последовательности с клавиатуры и сохранять их.
3. Создадим массив dp длиной 3 (так как сумма элементов должна быть делителем 3). Начальные значения элементов этого массива будут равны 0.
4. Теперь мы пройдемся по всем элементам последовательности и будем обновлять значения массива dp.
- Для каждого элемента a, мы проверяем остаток от деления a на 3 и обновляем соответствующий элемент dp:
- Если остаток равен 0, увеличиваем значение dp[0] на 1.
- Если остаток равен 1, мы должны проверить, какое значение dp[2] или dp[1] больше, и обновим его на максимальное значение.
- Если остаток равен 2, мы должны проверить, какое значение dp[1] или dp[2] больше, и обновим его на максимальное значение.
5. После завершения прохода по всем элементам последовательности, элемент dp[0] будет содержать длину наидлиннейшей подпоследовательности, сумма элементов которой делится на 3.
6. Выводим значение dp[0] на экран.

Вот пример кода на языке C++, который решает данную задачу:

cpp
#include
#include

using namespace std;

int main() {
int n;
cin >> n;

int dp[3] = {0};

for (int i = 0; i < n; i++) {
int a;
cin >> a;

int rem = a % 3;
if (rem == 0) {
dp[0]++;
} else if (rem == 1) {
dp[1] = max(dp[1], dp[2] + 1);
} else if (rem == 2) {
dp[2] = max(dp[2], dp[1] + 1);
}
}

cout << dp[0] << endl;

return 0;
}


Позвольте мне знать, если у вас есть какие-либо вопросы по данному решению или если вам нужно дополнительное объяснение.
Знаешь ответ?
Задать вопрос
Привет!
hello