Maximum path sum that starting with any cell of 0-th row and ending with any cell of (N-1)-th row

07 Jul, 2022
Given a N X N matrix Mat[N][N] of positive integers. There are only three possible moves from a cell (i, j) 
(i+1, j)(i+1, j-1)(i+1, j+1)
(i+1, j)
(i+1, j-1)
(i+1, j+1)
Starting from any column in row 0, return the largest sum of any of the paths up to row N-1.
Examples: 
Input : mat[4][4] = { {4, 2, 3, 4},
                      {2, 9, 1, 10},
                      {15, 1, 3, 0},
                      {16, 92, 41, 44} };
Output :120
path : 4 + 9 + 15 + 92 = 120 
Asked in: Amazon interview 
The above problem can be recursively defined.Let initial position be MaximumPathSum(N-1, j), where j varies from 0 to N-1. We return maximum value between all path that we start traversing (N-1, j) [ where j varies from 0 to N-1] 
i = N-1, j = 0 to N -1
int MaximumPath(Mat[][N], I, j)
 
  // IF we reached to first row of 
  // matrix then return value of that 
  // element  
  IF ( i == 0 && j = 0 )
  return    Mat[i][j]

  // out of matrix bound 
  IF( i = N || j < 0 )
   return 0;

  // call all rest position that we reached
  // from current position and find maximum 
  // between them and add current value in 
  // that path 
  return max(MaximumPath(Mat, i-1, j), 
             MaximumPath(Mat, i-1, j-1), 
             MaximumPath(Mat, i-1, j+1)))
             + Mat[i][j];
If we draw recursion tree of above recursive solution, we can observe overlapping subproblems. Since the problem has overlapping subproblems, we can solve it efficiently using Dynamic Programming. Below is Dynamic Programming based solution. 
Implementation:
C++
Java
Python3
C#
PHP
Javascript
// C++ program to find Maximum path sum// start any column in row '0' and ends// up to any column in row 'n-1'#include<bits/stdc++.h>using namespace std;#define N 4 // function find maximum sum pathint MaximumPath(int Mat[][N]){    int result = 0 ;     // create 2D matrix to store the sum    // of the path    int dp[N][N+2];     // initialize all dp matrix as '0'    memset(dp, 0, sizeof(dp));     // copy all element of first row into    // 'dp' first row    for (int i = 0 ; i < N ; i++)        dp[0][i+1] = Mat[0][i];     for (int i = 1 ; i < N ; i++)        for (int j = 1 ; j <= N ; j++)            dp[i][j] = max(dp[i-1][j-1],                           max(dp[i-1][j],                               dp[i-1][j+1])) +                       Mat[i][j-1] ;     // Find maximum path sum that end ups    // at  any column of last row 'N-1'    for (int i=0; i<=N; i++)        result = max(result, dp[N-1][i]);     // return maximum sum path    return result ;} // driver program to test above functionint main(){    int Mat[4][4] = { { 4, 2 , 3 , 4 },        { 2 , 9 , 1 , 10},        { 15, 1 , 3 , 0 },        { 16 ,92, 41, 44 }    };     cout << MaximumPath ( Mat ) <<endl ;    return 0;}
// Java program to find Maximum path sum// start any column in row '0' and ends// up to any column in row 'n-1'import java.util.*; public class GFG {         private static int N = 4;     // function find maximum sum path    private static int maximumPath(int Mat[][]){        int result = 0;         // create 2D matrix to store the sum        // of the path        int dp[][] = new int[N][N + 2];         // copy all element of first row into        // 'dp' first row        for (int i = 0; i < N; i++)            dp[0][i + 1] = Mat[0][i];         for (int i = 1; i < N; i++)            for (int j = 1; j <= N; j++)                dp[i][j] = Math.max(dp[i - 1][j - 1],                                    Math.max(dp[i - 1][j],                                    dp[i - 1][j + 1])) +                                    Mat[i][j - 1];         // Find maximum path sum that end ups        // at any column of last row 'N-1'        for (int i = 0; i <= N; i++)            result = Math.max(result, dp[N - 1][i]);         // return maximum sum path        return result;    }         // driver code    public static void main(String arg[]){        int Mat[][] = { { 4, 2, 3, 4 },                        { 2, 9, 1, 10 },                        { 15, 1, 3, 0 },                        { 16, 92, 41, 44 } };         System.out.println(maximumPath(Mat));    }} // This code is contributed by Anant Agarwal.
# Python3 program to find# Maximum path sum# start any column in# row '0' and ends# up to any column in row 'n-1' N = 4 # function find maximum sum pathdef MaximumPath(Mat):     result = 0     # create 2D matrix to store the sum    # of the path    # initialize all dp matrix as '0'    dp = [[0 for i in range(N+2)] for j in range(N)]     # copy all element of first row into    # dp first row    for i in range(N):        for j in range(1, N+1):            dp[i][j] = max(dp[i-1][j-1],                           max(dp[i-1][j],                               dp[i-1][j+1])) + \                       Mat[i][j-1]     # Find maximum path sum that end ups    # at any column of last row 'N-1'    for i in range(N+1):        result = max(result, dp[N-1][i])     # return maximum sum path    return result # driver program to test above functionMat = [[4, 2, 3, 4],       [2, 9, 1, 10],       [15, 1, 3, 0],       [16, 92, 41, 44]] print(MaximumPath(Mat)) # This code is contributed by Soumen Ghosh.
// C# program to find Maximum path sum// start any column in row '0' and ends// up to any column in row 'n-1'using System; class GFG {         static int N = 4;     // function find maximum sum path    static int MaximumPath(int [,] Mat)    {        int result = 0;         // create 2D matrix to store the sum        // of the path        int [,]dp = new int[N,N + 2];         // initialize all dp matrix as '0'        //for (int[] rows : dp)        //    Arrays.fill(rows, 0);         // copy all element of first row into        // 'dp' first row        for (int i = 0; i < N; i++)            dp[0,i + 1] = Mat[0,i];         for (int i = 1; i < N; i++)            for (int j = 1; j <= N; j++)                dp[i,j] = Math.Max(dp[i - 1,j - 1],                                    Math.Max(dp[i - 1,j],                                    dp[i - 1,j + 1])) +                                    Mat[i,j - 1];         // Find maximum path sum that end ups        // at any column of last row 'N-1'        for (int i = 0; i <= N; i++)            result = Math.Max(result, dp[N - 1,i]);         // return maximum sum path        return result;    }         // driver code    public static void Main()    {        int [,]Mat = { { 4, 2, 3, 4 },                        { 2, 9, 1, 10 },                        { 15, 1, 3, 0 },                        { 16, 92, 41, 44 } };         Console.WriteLine(MaximumPath(Mat));    }} // This code is contributed by Ryuga.
<?php// PHP program to find Maximum path sum// start any column in row '0' and ends// up to any column in row 'n-1'$N = 4; // function find maximum sum pathfunction MaximumPath(&$Mat){    global $N;    $result = 0;     // create 2D matrix to store the sum    // of the path    $dp = array_fill(0, $N,          array_fill(0, $N + 2, NULL));     // copy all element of first row    // into 'dp' first row    for ($i = 0 ; $i < $N ; $i++)        $dp[0][$i + 1] = $Mat[0][$i];     for ($i = 1 ; $i < $N ; $i++)        for ($j = 1 ; $j <= $N ; $j++)            $dp[$i][$j] = max($dp[$i - 1][$j - 1],                          max($dp[$i - 1][$j],                              $dp[$i - 1][$j + 1])) +                              $Mat[$i][$j - 1] ;     // Find maximum path sum that end ups    // at any column of last row 'N-1'    for ($i = 0; $i <= $N; $i++)        $result = max($result, $dp[$N - 1][$i]);     // return maximum sum path    return $result ;} // Driver Code$Mat = array(array(4, 2 , 3 , 4),             array(2 , 9 , 1 , 10),             array(15, 1 , 3 , 0),             array(16 ,92, 41, 44)); echo MaximumPath ($Mat) . "\n" ; // This code is contributed by ita_c?>
<script> // Javascript program to find Maximum path sum// start any column in row '0' and ends// up to any column in row 'n-1'         let N = 4;         // function find maximum sum path    function MaximumPath(Mat)    {        let result = 0;           // create 2D matrix to store the sum        // of the path        let dp = new Array(N);                 // initialize all dp matrix as '0'        for(let i=0;i<N;i++)        {            dp[i]=new Array(N+2);            for(let j=0;j<N+2;j++)            {                dp[i][j]=0;            }        }                    // copy all element of first row into        // 'dp' first row        for (let i = 0; i < N; i++)            dp[0][i + 1] = Mat[0][i];           for (let i = 1; i < N; i++)            for (let j = 1; j <= N; j++)                dp[i][j] = Math.max(dp[i - 1][j - 1],                                    Math.max(dp[i - 1][j],                                    dp[i - 1][j + 1])) +                                    Mat[i][j - 1];           // Find maximum path sum that end ups        // at any column of last row 'N-1'        for (let i = 0; i <= N; i++)            result = Math.max(result, dp[N - 1][i]);           // return maximum sum path        return result;    }         // driver code    let Mat = [[4, 2, 3, 4],       [2, 9, 1, 10],       [15, 1, 3, 0],       [16, 92, 41, 44]]    document.write(MaximumPath(Mat))          // This code is contributed by rag2127     </script>
120
Time complexity : O(N2) 
This article is contributed by Nishant Singh . If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks. 
ankthon
ukasp
rag2127
saurabh1990aror
abhishekagashe
ashutosh dubey 2
hardikkoriintern
Dynamic Programming
Matrix
Dynamic Programming
Matrix
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Subset Sum Problem | DP-25
Longest Palindromic Substring | Set 1
Floyd Warshall Algorithm | DP-16
Matrix Chain Multiplication | DP-8
Sieve of Eratosthenes
Matrix Chain Multiplication | DP-8
Print a given matrix in spiral form
Program to find largest element in an array
Rat in a Maze | Backtracking-2
Sudoku | Backtracking-7