Maximize sum by traversing diagonally from each cell of a given Matrix
Last Updated :
01 Dec, 2022
Given a 2D square matrix arr[][] of dimensions N x N, the task is to find the maximum path sum by moving diagonally from any cell and each cell must be visited only once i.e., from the cell (i, j), a player can move to the cell (i + 1, j + 1).
Examples:
Input: arr[][] = {{1, 2, 3}, {3, 5, 10}, {1 3 5}}
Output: 12
Explanation:
Sum of cells (1, 1), (2, 2) and (3, 3) is 11.
The sum of cells (1, 2), (2, 3) and (1, 3) is 3.
The sum of cells (2, 1) and (3, 2) is 6.
The sum of cell (3, 1) is 1.
The maximum possible sum is 12.
Input: arr[][] = {{1, 1, 1}, {1 1 1}, {1 1 1}}
Output: 3
Approach: To solve this problem, the idea is to traverse the matrix diagonally for first row and column elements and sum up their diagonal elements within the range of the matrix.
Follow the steps below to solve the problem:
- Initialize a variable, say max with 0.
- Choose each cell (i, j) from the first row and from the first column.
- Now, from each cell, find the diagonal sum starting from that cell by incrementing i and j by 1, say sum.
- Then, update max as max(max, sum).
- After traversing, print max as the required answer.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int MaximumSum(vector<vector< int > >& arr, int n)
{
int ans = 0;
for ( int i = 0; i < n; i++) {
int x = 0, y = i, sum = 0;
for ( int j = i; j < n; j++) {
sum += arr[x++][y++];
}
if (sum > ans)
ans = sum;
}
for ( int i = 1; i < n; i++) {
int x = i, y = 0, sum = 0;
for ( int j = i; j < n; j++) {
sum += arr[x++][y++];
}
if (sum > ans)
ans = sum;
}
return ans;
}
int main()
{
vector<vector< int > > arr;
arr = { { 1, 2, 3 },
{ 3, 5, 10 },
{ 1, 3, 5 } };
int n = arr.size();
cout << MaximumSum(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG{
static int MaximumSum( int [][]arr, int n)
{
int ans = 0 ;
for ( int i = 0 ; i < n; i++)
{
int x = 0 , y = i, sum = 0 ;
for ( int j = i; j < n; j++)
{
sum += arr[x++][y++];
}
if (sum > ans)
ans = sum;
}
for ( int i = 1 ; i < n; i++)
{
int x = i, y = 0 , sum = 0 ;
for ( int j = i; j < n; j++)
{
sum += arr[x++][y++];
}
if (sum > ans)
ans = sum;
}
return ans;
}
public static void main(String[] args)
{
int [][]arr = { { 1 , 2 , 3 },
{ 3 , 5 , 10 },
{ 1 , 3 , 5 } };
int n = arr.length;
System.out.print(MaximumSum(arr, n));
}
}
|
Python3
def MaximumSum(arr, n):
ans = 0 ;
for i in range (n):
x, y, sum = 0 , i, 0
for j in range (i, n):
sum , x, y = sum + arr[x][y], x + 1 , y + 1
if ( sum > ans):
ans = sum
for i in range ( 1 , n):
x, y, sum = i, 0 , 0
for j in range (i, n):
sum , x, y = sum + arr[x][y], x + 1 , y + 1
if ( sum > ans):
ans = sum
return ans
if __name__ = = '__main__' :
arr = [ [ 1 , 2 , 3 ],
[ 3 , 5 , 10 ],
[ 1 , 3 , 5 ]]
n = len (arr)
print (MaximumSum(arr, n))
|
C#
using System;
class GFG{
static int MaximumSum( int [,]arr, int n)
{
int ans = 0;
for ( int i = 0; i < n; i++)
{
int x = 0, y = i, sum = 0;
for ( int j = i; j < n; j++)
{
sum += arr[x++, y++];
}
if (sum > ans)
ans = sum;
}
for ( int i = 1; i < n; i++)
{
int x = i, y = 0, sum = 0;
for ( int j = i; j < n; j++)
{
sum += arr[x++, y++];
}
if (sum > ans)
ans = sum;
}
return ans;
}
public static void Main(String[] args)
{
int [,]arr = { { 1, 2, 3 },
{ 3, 5, 10 },
{ 1, 3, 5 } };
int n = arr.GetLength(0);
Console.Write(MaximumSum(arr, n));
}
}
|
Javascript
<script>
function MaximumSum(arr, n)
{
let ans = 0;
for (let i = 0; i < n; i++)
{
let x = 0, y = i, sum = 0;
for (let j = i; j < n; j++)
{
sum += arr[x++][y++];
}
if (sum > ans)
ans = sum;
}
for (let i = 1; i < n; i++)
{
let x = i, y = 0, sum = 0;
for (let j = i; j < n; j++)
{
sum += arr[x++][y++];
}
if (sum > ans)
ans = sum;
}
return ans;
}
let arr = [[ 1, 2, 3 ],
[ 3, 5, 10 ],
[ 1, 3, 5 ]];
let n = arr.length;
document.write(MaximumSum(arr, n));
</script>
|
Time Complexity: O(N2)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...