Незнайка 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.
• 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
Хорошо, чтобы решить данную задачу, мы можем использовать метод, называемый динамическим программированием.
Давайте разберем каждый шаг данного алгоритма:
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++, который решает данную задачу:
Позвольте мне знать, если у вас есть какие-либо вопросы по данному решению или если вам нужно дополнительное объяснение.
Давайте разберем каждый шаг данного алгоритма:
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;
}
Позвольте мне знать, если у вас есть какие-либо вопросы по данному решению или если вам нужно дополнительное объяснение.
Знаешь ответ?