Рубрики

Найти минимальное количество операций слияния для создания массива палиндрома

Дан массив натуральных чисел. Нам нужно сделать данный массив «палиндромом». Единственная разрешенная операция над массивом — слияние. Объединение двух смежных элементов означает замену их суммой. Задача состоит в том, чтобы найти минимальное количество операций слияния, необходимых для того, чтобы сделать данный массив «палиндромом».

Чтобы сделать массив палиндромным, мы можем просто применить операции слияния n-1 раз, где n — это размер массива (обратите внимание, что массив из одного элемента всегда палиндром похож на односимвольную строку). В этом случае размер массива будет уменьшен до 1. Но в этой задаче нас просят сделать это за минимальное количество операций.

Пример :

Input : arr[] = {15, 4, 15}
Output : 0
Array is already a palindrome. So we
do not need any merge operation.

Input : arr[] = {1, 4, 5, 1}
Output : 1
We can make given array palindrome with
minimum one merging (merging 4 and 5 to
make 9)

Input : arr[] = {11, 14, 15, 99}
Output : 3
We need to merge all elements to make
a palindrome.

Ожидаемая сложность времени O (n).

Мы настоятельно рекомендуем вам нажать здесь и попрактиковаться, прежде чем переходить к решению.

Пусть f (i, j) — минимальные операции слияния, чтобы сделать подмассив arr [i..j] палиндромом. Если i == j, ответ равен 0. Мы начинаем i с 0, а j с n-1.

  1. Если arr [i] == arr [j], то нет необходимости выполнять какие-либо операции слияния с индексом i или индексом j. Наш ответ в этом случае будет f (i + 1, j-1).
  2. Иначе нам нужно сделать операции слияния. Возникают следующие случаи.
  • Если arr [i]> arr [j], то мы должны выполнить операцию слияния с индексом j. Мы объединяем индексы j-1 и j и обновляем arr [j-1] = arr [j-1] + arr [j]. Наш ответ в этом случае будет 1 + f (i, j-1).
  • Для случая, когда arr [i] <arr [j], обновите arr [i + 1] = arr [i + 1] + arr [i]. Наш ответ в этом случае будет 1 + f (i + 1, j).
  • Наш ответ будет f (0, n-1), где n — размер массива arr [].
  • Поэтому эту проблему можно решить итеративно, используя метод двух указателей (первый указатель указывает на начало массива и второй указатель указывает на последний элемент массива) и ведет подсчет общего количества операций слияния, выполненных до настоящего времени.

    Ниже приведена реализация вышеуказанной идеи.

    С

    // C ++ программа для поиска количества операций
    // сделать массив палиндромом
    #include <bits/stdc++.h>

    using namespace std;

      
    // Возвращает минимальное количество операций подсчета
    // требуется сделать arr [] палиндром

    int findMinOps(int arr[], int n)

    {

        int ans = 0; // Инициализировать результат

      

        // Начинаем с двух углов

        for (int i=0,j=n-1; i<=j;)

        {

            // Если угловые элементы одинаковы,

            // проблема уменьшает обр [i + 1..j-1]

            if (arr[i] == arr[j])

            {

                i++;

                j--;

            }

      

            // Если левый элемент больше, то

            // объединяем два правых элемента

            else if (arr[i] > arr[j])

            {

                // нужно слить из хвоста.

                j--;

                arr[j] += arr[j+1] ;

                ans++;

            }

      

            // иначе сливаем два левых элемента

            else

            {

                i++;

                arr[i] += arr[i-1];

                ans++;

            }

        }

      

        return ans;

    }

      
    // Программа драйвера для тестирования выше

    int main()

    {

        int arr[] = {1, 4, 5, 9, 1};

        int n = sizeof(arr)/sizeof(arr[0]);

        cout << "Count of minimum operations is "

             <<  findMinOps(arr, n) << endl;

        return 0;

    }

    Джава

    // Java-программа для поиска количества операций
    // сделать массив палиндромом

      

    class GFG

    {

        // Возвращает минимальное количество операций подсчета

        // требуется сделать arr [] палиндром

        static int findMinOps(int[] arr, int n)

        {

            int ans = 0; // Инициализировать результат

      

            // Начинаем с двух углов

            for (int i=0,j=n-1; i<=j;)

            {

                // Если угловые элементы одинаковы,

                // проблема уменьшает обр [i + 1..j-1]

                if (arr[i] == arr[j])

                {

                    i++;

                    j--;

                }

      

                // Если левый элемент больше, то

                // объединяем два правых элемента

                else if (arr[i] > arr[j])

                {

                    // нужно слить из хвоста.

                    j--;

                    arr[j] += arr[j+1] ;

                    ans++;

                }

      

                // иначе сливаем два левых элемента

                else

                {

                    i++;

                    arr[i] += arr[i-1];

                    ans++;

                }

            }

      

            return ans;

        }

      

        // Метод драйвера для проверки вышеуказанной функции

        public static void main(String[] args)

        {

            int arr[] = new int[]{1, 4, 5, 9, 1} ;

            System.out.println("Count of minimum operations is "+

                                    findMinOps(arr, arr.length));

          

        }

    }

    питон

    # Программа Python для определения количества операций
    # сделать массив палиндромом

      
    # Возвращает минимальное количество операций подсчета
    # требуется сделать arr [] палиндром

    def findMinOps(arr, n):

        ans = 0 # Инициализировать результат

      

        # Начнем с двух углов

        i,j = 0,n-1

        while i<=j:

            # Если угловые элементы одинаковы,

            # проблема уменьшает обр [i + 1..j-1]

            if arr[i] == arr[j]:

                i += 1

                j -= 1

      

            # Если левый элемент больше, то

            # объединяем два правых элемента

            elif arr[i] > arr[j]:

                # нужно слить с хвоста.

                j -= 1

                arr[j] += arr[j+1

                ans += 1

      

            # Иначе мы объединяем левые два элемента

            else:

                i += 1

                arr[i] += arr[i-1]

                ans += 1

      

        return ans

      

      
    # Программа драйвера для тестирования выше

    arr = [1, 4, 5, 9, 1]

    n = len(arr)

    print("Count of minimum operations is " + str(findMinOps(arr, n)))

      
    # Этот код предоставлен Pratik Chhajer

    C #

    // C # программа для поиска количества операций
    // сделать массив палиндромом

    using System;

      

    class GFG

    {

        // Возвращает минимальное количество операций подсчета

        // требуется сделать arr [] палиндром

        static int findMinOps(int []arr, int n)

        {

            int ans = 0; // Инициализировать результат

      

            // Начинаем с двух углов

            for (int i = 0, j = n - 1; i <= j;)

            {

                // Если угловые элементы одинаковы,

                // проблема уменьшает обр [i + 1..j-1]

                if (arr[i] == arr[j])

                {

                    i++;

                    j--;

                }

      

                // Если левый элемент больше, то

                // объединяем два правых элемента

                else if (arr[i] > arr[j])

                {

                    // нужно слить из хвоста.

                    j--;

                    arr[j] += arr[j + 1] ;

                    ans++;

                }

      

                // иначе сливаем два левых элемента

                else

                {

                    i++;

                    arr[i] += arr[i-1];

                    ans++;

                }

            }

      

            return ans;

        }

      

        // Код драйвера

        public static void Main()

        {

            int []arr = new int[]{1, 4, 5, 9, 1} ;

            Console.Write("Count of minimum operations is " +

                                findMinOps(arr, arr.Length));

          

        }

    }

      
    // Этот код предоставлен нитин митталь

    PHP

    <?php
    // PHP программа для поиска номера
    // операций для создания
    // массив палиндром

      
    // Возвращает минимальное количество
    // требуется количество операций
    // сделать arr [] палиндром

    function findMinOps($arr, $n)

    {

        // Инициализировать результат

        $ans = 1; 

      

        // Начинаем с двух углов

        for ($i = 0, $j = $n - 1; $i <= $j😉

        {

            // Если угловые элементы одинаковы,

            // проблема уменьшает обр [i + 1..j-1]

            if ($arr[$i] == $arr[$j])

            {

                $i++;

                $j--;

            }

      

            // Если левый элемент больше, то

            // объединяем два правых элемента

            else if ($arr[$i] > $arr[$j])

            {

                // нужно слить из хвоста.

                $j--;

                $arr[$j] += $arr[$j + 1] ;

                $ans++;

            }

      

            // Остальное мы объединяем

            // осталось два элемента

            else

            {

                $i++;

                $arr[$i] += $arr[$i - 1];

                $ans++;

            }

        }

      

        return $ans;

    }

      
    // Код драйвера

    $arr[] = array(1, 4, 5, 9, 1);

    $n = sizeof($arr);

    echo "Count of minimum operations is "

                     findMinOps($arr, $n) ;

      
    // Этот код предоставлен нитин митталь.
    ?>


    Выход :

    Count of minimum operations is 1

    Временная сложность для данной программы: O (n)

    Эта статья предоставлена Ашишем Джайном . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

    Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

    Рекомендуемые посты:

    Найти минимальное количество операций слияния для создания массива палиндрома

    0.00 (0%) 0 votes