Программа подсчета количества последовательностей без двух нулей подряд

В мире программирования и комбинаторики существует множество задач, требующих точного подсчета различных комбинаций и последовательностей. Одной из таких увлекательных задач является подсчет количества последовательностей, в которых никакие два соседних элемента не могут быть нулями одновременно. Эта задача имеет широкое применение в различных областях, начиная от информационной безопасности и генетики, и заканчивая разработкой программного обеспечения и статистическим анализом. В данной статье мы рассмотрим эту интересную задачу и представим программное решение, которое позволит нам эффективно вычислять количество таких последовательностей для заданных параметров.

Теория

Для решения задачи «Требуется посчитать количество последовательностей длины n, состоящих из цифр от 0 до k-1, таких, что никакие два соседних элемента последовательности не равны нулю одновременно,» можно использовать метод динамического программирования.

Введем массив dp, где dp[i] будет представлять количество последовательностей длины i, удовлетворяющих условию задачи. Для начала определим базовые случаи:

dp[1] = k — 1, так как для первой цифры у нас есть k-1 вариант (все цифры от 0 до k-1 кроме 0).

dp[2] = (k — 1) * (k — 1), так как для второй цифры у нас также есть k-1 вариантов, и мы не хотим, чтобы она была равна нулю, как и первая цифра.

Затем мы используем рекуррентное соотношение для вычисления dp[i] для всех i от 3 до n:

dp[i] = (k - 1) * (dp[i - 1] + dp[i - 2])

Итак, алгоритм решения задачи можно описать следующим образом:

  • Инициализировать массив dp длиной n+1 и задать dp[1] = k — 1 и dp[2] = (k — 1) * (k — 1).
  • Вычислить dp[i] для всех i от 3 до n с использованием рекуррентного соотношения.
  • Вернуть dp[n] как результат.

Программно это может быть реализовано на многих языках программирования, включая C++, Python, Java и другие.

C++

Пример программы на C++, которая подсчитывает количество последовательностей без двух нулей подряд:

#include <iostream>

long long countSequences(int n) {
    if (n <= 0)
        return 0;
    if (n == 1)
        return 2;

    long long a = 1, b = 2;
    for (int i = 3; i <= n; i++) {
        long long temp = b;
        b = a + b;
        a = temp;
    }

    return b;
}

int main() {
    int n;

    // Ввод числа n
    std::cout << "Введите число n: ";
    std::cin >> n;

    long long sequences = countSequences(n);

    // Вывод результата
    std::cout << "Количество последовательностей без двух нулей подряд для n = " << n << ": " << sequences << std::endl;

    return 0;
}

Программа использует динамическое программирование для подсчета количества последовательностей без двух нулей подряд для заданного числа n. Вы можете скопировать этот код в файл с расширением .cpp, скомпилировать его и запустить для ввода числа n. Программа выведет количество таких последовательностей.

C#

using System;

class Program
{
    static long CountSequences(int n)
    {
        if (n <= 0)
            return 0;
        if (n == 1)
            return 2;

        long a = 1, b = 2;
        for (int i = 3; i <= n; i++)
        {
            long temp = b;
            b = a + b;
            a = temp;
        }

        return b;
    }

    static void Main()
    {
        int n;

        // Ввод числа n
        Console.Write("Введите число n: ");
        n = int.Parse(Console.ReadLine());

        long sequences = CountSequences(n);

        // Вывод результата
        Console.WriteLine($"Количество последовательностей без двух нулей подряд для n = {n}: {sequences}");
    }
}

Эта программа также использует динамическое программирование для подсчета количества последовательностей без двух нулей подряд для заданного числа n. Вы можете скопировать этот код, создать проект C# в среде разработки, вставить код в файл с расширением .cs, скомпилировать и запустить для ввода числа n.

Python

def count_sequences(n):
    if n <= 0:
        return 0
    if n == 1:
        return 2

    a, b = 1, 2
    for i in range(3, n + 1):
        temp = b
        b = a + b
        a = temp

    return b

# Ввод числа n
n = int(input("Введите число n: "))

sequences = count_sequences(n)

# Вывод результата
print(f"Количество последовательностей без двух нулей подряд для n = {n}: {sequences}")

Вы можете скопировать этот код и выполнить его в интерпретаторе Python. Программа запросит у вас число n, а затем выведет количество последовательностей без двух нулей подряд для этого числа.

Java

import java.util.Scanner;

public class CountSequences {
    static long countSequences(int n) {
        if (n <= 0)
            return 0;
        if (n == 1)
            return 2;

        long a = 1, b = 2;
        for (int i = 3; i <= n; i++) {
            long temp = b;
            b = a + b;
            a = temp;
        }

        return b;
    }

    public static void main(String[] args) {
        int n;

        // Ввод числа n
        Scanner scanner = new Scanner(System.in);
        System.out.print("Введите число n: ");
        n = scanner.nextInt();

        long sequences = countSequences(n);

        // Вывод результата
        System.out.println("Количество последовательностей без двух нулей подряд для n = " + n + ": " + sequences);
    }
}

Вы можете скопировать этот код, создать новый класс Java в вашей среде разработки, вставить код в файл с расширением .java, скомпилировать и запустить.

Pascal

program CountSequences;

function CountValidSequences(n, k: integer): integer;
begin
  if (n = 1) then
    CountValidSequences := k - 1
  else if (n = 2) then
    CountValidSequences := (k - 1) * (k - 1)
  else
    CountValidSequences := (k - 1) * (CountValidSequences(n - 1, k) + CountValidSequences(n - 2, k));
end;

var
  n, k: integer;
begin
  // Ввод чисел n и k
  Write('Введите длину последовательности (n): ');
  Readln(n);
  Write('Введите количество цифр (k): ');
  Readln(k);

  if (n < 1) or (k < 1) then
    Writeln('Некорректные входные данные')
  else
    Writeln('Количество последовательностей: ', CountValidSequences(n, k));
end.

Этот код использует рекурсивный подход для вычисления количества последовательностей. Программа спрашивает у пользователя длину последовательности n и количество цифр k, а затем вычисляет количество последовательностей, удовлетворяющих условию задачи.

Скопируйте этот код, сохраните его в файле с расширением .pas, и попробуйте выполнить его в среде Pascal ABC.

JavaScript

Пример программы на JavaScript, которая подсчитывает количество последовательностей длины n, состоящих из цифр от 0 до k-1, таких, что никакие два соседних элемента последовательности не равны нулю одновременно:

function countSequences(n, k) {
    if (n <= 0 || k <= 0) {
        return 0;
    }

    // Создаем массив для хранения количества последовательностей длины n
    // с последней цифрой, которая не равна нулю
    const dp = new Array(n + 1).fill(0);
    dp[1] = k - 1; // Количество вариантов для первой цифры

    for (let i = 2; i <= n; i++) {
        dp[i] = (k - 1) * (dp[i - 1] + dp[i - 2]);
    }

    return dp[n];
}

// Ввод числа n и k
const n = parseInt(prompt("Введите длину последовательности (n):"));
const k = parseInt(prompt("Введите количество цифр (k):"));

if (n >= 1 && k >= 1) {
    const sequences = countSequences(n, k);
    alert(`Количество последовательностей: ${sequences}`);
} else {
    alert("Некорректные входные данные.");
}

Вы можете скопировать этот код и выполнить его в браузере, вставив его в консоль разработчика (F12 -> Консоль) или создав HTML-страницу с соответствующим скриптом. Программа запросит у вас длину последовательности n и количество цифр k, а затем выведет количество удовлетворяющих условию последовательностей.

PHP

<?php
function countSequences($n, $k) {
    if ($n <= 0 || $k <= 0) {
        return 0;
    }

    // Создаем массив для хранения количества последовательностей длины n
    // с последней цифрой, которая не равна нулю
    $dp = array_fill(0, $n + 1, 0);
    $dp[1] = $k - 1; // Количество вариантов для первой цифры

    for ($i = 2; $i <= $n; $i++) {
        $dp[$i] = ($k - 1) * ($dp[$i - 1] + $dp[$i - 2]);
    }

    return $dp[$n];
}

// Ввод числа n и k
$n = (int) readline("Введите длину последовательности (n): ");
$k = (int) readline("Введите количество цифр (k): ");

if ($n >= 1 && $k >= 1) {
    $sequences = countSequences($n, $k);
    echo "Количество последовательностей: $sequences\n";
} else {
    echo "Некорректные входные данные.\n";
}
?>

Вы можете скопировать этот код и выполнить его на вашем веб-сервере с поддержкой PHP или в среде разработки, которая поддерживает выполнение PHP-скриптов. Программа запросит у вас длину последовательности n и количество цифр k, а затем выведет количество удовлетворяющих условию последовательностей.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Давайте поможем друг другу! Если вы нашли ошибку или хотите предложить лучшее решение, пожалуйста, напишите об этом в комментариях.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *