Рубрики

Максимальная сумма пути в правильном числовом треугольнике

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

Примеры :

Input : 1
        1 2
        4 1 2
        2 3 1 1        
Output : 9
Explanation : 1 + 1 + 4 + 3

Input : 2
        4 1
        1 2 7
Output : 10
Explanation : 2 + 1 + 7

Идея состоит в том, чтобы найти наибольшую сумму, заканчивающуюся в каждой ячейке последней строки, и вернуть максимум этих сумм. Мы можем рекурсивно вычислить эти суммы, рекурсивно рассматривая выше две ячейки. Поскольку существуют перекрывающиеся подзадачи, мы используем динамическое программирование, чтобы найти максимальную сумму, заканчивающуюся в конкретной ячейке последней строки.

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

C ++

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

using namespace std;

  
// функция для поиска максимальной суммы пути

int maxSum(int tri[][3], int n)

{

    // Добавляем элемент строки 1 в оба

    // элементы строки 2, чтобы уменьшить шаг от

    // петля

    if (n > 1)

        tri[1][1] = tri[1][1] + tri[0][0];

        tri[1][0] = tri[1][0] + tri[0][0];

  

    // Обходим оставшиеся строки

    for(int i = 2; i < n; i++) {

        tri[i][0] = tri[i][0] + tri[i-1][0];

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

  

        // цикл по столбцам

        for (int j = 1; j < i; j++){

  

            // Проверка двух условий,

            // прямо внизу и внизу справа.

            // Учитывая больший

              

            // tri [i] будет хранить возможные

            // комбинации сумм путей

            if (tri[i][j] + tri[i-1][j-1] >= 

                            tri[i][j] + tri[i-1][j])

                  

                tri[i][j] = tri[i][j] + tri[i-1][j-1];

            else

                tri[i][j] = tri[i][j]+tri[i-1][j];

        }

    }

      

    // массив с индексом n-1 (tri [i]) сохраняет

    // все возможное добавление комбинации, поиск

    // максимальный из них

    int max=tri[n-1][0];

      

    for(int i=1;i<n;i++)

    {

        if(max<tri[n-1][i])

            max=tri[n-1][i];

    }

      

    return max;

}

  
// драйверная программа

int main(){

      

    int tri[3][3] = {{1}, {2,1}, {3,3,2}};

  

    cout<<maxSum(tri, 3);

      

    return 0;

}

Джава

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

class GFG

{

      

    // функция для поиска максимальной суммы пути

    static int maxSum(int tri[][], int n)

    {

          

        // Добавляем элемент строки 1 в оба

        // элементы строки 2, чтобы уменьшить шаг от

        // петля

        if (n > 1)

            tri[1][1] = tri[1][1] + tri[0][0];

            tri[1][0] = tri[1][0] + tri[0][0];

      

        // Обходим оставшиеся строки

        for(int i = 2; i < n; i++) {

            tri[i][0] = tri[i][0] + tri[i-1][0];

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

      

            // цикл по столбцам

            for (int j = 1; j < i; j++){

      

                // Проверка двух условий,

                // прямо внизу и внизу справа.

                // Учитывая больший

                  

                // tri [i] будет хранить возможные

                // комбинации сумм путей

                if (tri[i][j] + tri[i-1][j-1] >= 

                           tri[i][j] + tri[i-1][j])

                      

                    tri[i][j] = tri[i][j] 

                                  + tri[i-1][j-1];

                      

                else

                    tri[i][j] = tri[i][j]

                                    + tri[i-1][j];

            }

        }

          

        // массив с индексом n-1 (tri [i]) сохраняет

        // все возможные комбинации добавления,

        // найти максимальный из них

        int max = tri[n-1][0];

          

        for(int i = 1; i < n; i++)

        {

            if(max < tri[n-1][i])

                max = tri[n-1][i];

        }

          

        return max;

    

          

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

    public static void main (String[] args)

    {

        int tri[][] = {{1}, {2,1}, {3,3,2}};

          

        System.out.println(maxSum(tri, 3));

    }

}

  
// Этот код предоставлен Anant Agarwal.

питон

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

  
# tri [] [] - это двумерный массив, в котором хранятся
# треугольник, n - количество строк или строк.

def maxSum(tri, n):

  

    # Добавление элемента строки 1 в оба

    # элементы строки 2, чтобы уменьшить шаг от

    # петля

    if n > 1:

        tri[1][1] = tri[1][1]+tri[0][0]

        tri[1][0] = tri[1][0]+tri[0][0]

  

    # Пройти остальные строки

    for i in range(2, n):

        tri[i][0] = tri[i][0] + tri[i-1][0]

        tri[i][i] = tri[i][i] + tri[i-1][i-1]

  

        # Цикл для обхода столбцов

        for j in range(1, i):

  

            # Проверка двух условий, прямо ниже

            # и ниже справа. Учитывая большую

  

            # tri [i] будет хранить возможные комбинации

            № суммы путей

            if tri[i][j]+tri[i-1][j-1] >= tri[i][j]+tri[i-1][j]:

                tri[i][j] = tri[i][j] + tri[i-1][j-1]

            else:

                tri[i][j] = tri[i][j]+tri[i-1][j]

  

    # массив с индексом n-1 (tri [i]) хранит все возможные

    # добавление комбинации, поиск максимальной

    # из них

    print max(tri[n-1])

  
# драйверная программа

tri = [[1], [2,1], [3,3,2]]

maxSum(tri, 3)

C #

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

using System;

  

class GFG

{

      

    // функция для поиска

    // путь максимальной суммы

    static int maxSum(int [,]tri, 

                      int n)

    {

          

        // Добавляем элемент строки 1

        // к обоим элементам строки 2

        // уменьшить шаг из цикла

        if (n > 1)

            tri[1, 1] = tri[1, 1] + 

                        tri[0, 0];

            tri[1, 0] = tri[1, 0] + 

                        tri[0, 0];

      

        // Обходим оставшиеся строки

        for(int i = 2; i < n; i++) 

        {

            tri[i, 0] = tri[i, 0] + 

                        tri[i - 1, 0];

            tri[i, i] = tri[i, i] + 

                        tri[i - 1, i - 1];

       

            // цикл по столбцам

            for (int j = 1; j < i; j++)

            {

      

                // Проверка двух условий,

                // прямо внизу и внизу справа.

                // Учитывая больший

                  

                // tri [i] будет хранить возможные

                // комбинации сумм путей

                if (tri[i, j] + tri[i - 1, j - 1] >= 

                    tri[i, j] + tri[i - 1, j])

                  

                    tri[i, j] = tri[i, j] + 

                                tri[i - 1, j - 1];

                      

                else

                    tri[i, j] = tri[i, j] + 

                                tri[i - 1, j];

            }

        }

          

        // массив с индексом n-1 (tri [i])

        // сохраняет все возможные добавления

        // комбинация, находящая

        // максимум один из них

        int max = tri[n - 1, 0];

          

        for(int i = 1; i < n; i++)

        {

            if(max < tri[n - 1, i])

                max = tri[n - 1, i];

        }

          

        return max;

    

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

public static void Main ()

{

      

        int [,]tri = {{1,0,0}, 

                      {2,1,0},

                      {3,3,2}};

          

        Console.Write(maxSum(tri, 3));

}
}

  
// Этот код предоставлен ajit.

PHP

<?php
// PHP программа для вывода максимальной суммы
// в правом треугольнике чисел

  
// функция для поиска максимальной суммы пути

function maxSum($tri, $n)

{

    // Добавляем элемент строки 1

    // обоим элементам строки

    // 2 чтобы уменьшить шаг из цикла

    if ($n > 1)

        $tri[1][1] = $tri[1][1] + $tri[0][0];

        $tri[1][0] = $tri[1][0] + $tri[0][0];

  

    // Обходим оставшиеся строки

    for($i = 2; $i < $n; $i++)

    {

        $tri[$i][0] = $tri[$i][0] + 

                      $tri[$i - 1][0];

        $tri[$i][$i] = $tri[$i][$i] + 

                       $tri[$i - 1][$i - 1];

  

        // цикл по столбцам

        for ($j = 1; $j < $i; $j++)

        {

  

            // Проверка двух условий,

            // прямо внизу и внизу справа.

            // Учитывая больший

              

            // tri [i] будет хранить возможные

            // комбинации сумм путей

            if ($tri[$i][$j] + $tri[$i - 1][$j - 1] >= 

                 $tri[$i][$j] + $tri[$i - 1][$j])

                  

                $tri[$i][$j] = $tri[$i][$j] + 

                               $tri[$i - 1][$j - 1];

            else

                $tri[$i][$j] = $tri[$i][$j] + 

                               $tri[$i - 1][$j];

        }

    }

      

    // массив с индексом n-1 (tri [i])

    // сохраняет все возможные добавления

    // комбинация, находящая

    // максимум один из них

      

    $max = $tri[$n - 1][0];

      

    for($i = 1; $i < $n; $i++)

    {

        if($max < $tri[$n - 1][$i])

            $max = $tri[$n - 1][$i];

    }

      

    return $max;

}

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

$tri = array(array(1),

             array(2,1), 

             array(3,3,2));

  

echo maxSum($tri, 3);

  
// Этот код предоставлен ajit
?>


Выход :

6

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

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

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

Максимальная сумма пути в правильном числовом треугольнике

0.00 (0%) 0 votes