给定尺寸为N x N的2D方阵arr [] [] ,任务是通过从任意一个单元斜向移动来找到最大路径总和,并且每个单元只能访问一次,即从该单元(i,j)开始访问,玩家可以移至该单元格(i + 1,j + 1) 。
例子:
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
方法:解决此问题的想法是对角地遍历第一行和第一列元素的矩阵,并在矩阵范围内求和它们的对角元素。
请按照以下步骤解决问题:
- 初始化一个变量,用0表示max 。
- 从第一行和第一列中选择每个单元格(i,j) 。
- 现在,从每个像元中,通过将i和j加1来表示从该像元开始的对角和,即sum 。
- 然后,将max更新为max(max,sum) 。
- 遍历后,将max作为所需答案打印。
下面是上述方法的实现:
C++
// C++ program for the above approach
#include
using namespace std;
// Funtion to find the maximum sum
int MaximumSum(vector >& arr, int n)
{
int ans = 0;
// Loop to traverse through the
// upper triangular matrix and
// update the maximum sum to ans
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;
}
// Traverse through the
// lower triangular matrix
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;
}
// Driver Code
int main()
{
// Given matrix
vector > arr;
arr = { { 1, 2, 3 },
{ 3, 5, 10 },
{ 1, 3, 5 } };
// Given dimension
int n = arr.size();
cout << MaximumSum(arr, n);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
// Funtion to find the maximum sum
static int MaximumSum(int [][]arr, int n)
{
int ans = 0;
// Loop to traverse through the
// upper triangular matrix and
// update the maximum sum to ans
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;
}
// Traverse through the
// lower triangular matrix
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;
}
// Driver Code
public static void main(String[] args)
{
// Given matrix
int [][]arr = { { 1, 2, 3 },
{ 3, 5, 10 },
{ 1, 3, 5 } };
// Given dimension
int n = arr.length;
System.out.print(MaximumSum(arr, n));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 program for the above approach
# Funtion to find the maximum sum
def MaximumSum(arr, n):
ans = 0;
# Loop to traverse through the
# upper triangular matrix and
# update the maximum sum to ans
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
# Traverse through the
# lower triangular matrix
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
# Driver Code
if __name__ == '__main__':
# Given matrix
arr = [ [ 1, 2, 3],
[ 3, 5, 10],
[ 1, 3, 5 ]]
# Given dimension
n = len(arr)
print (MaximumSum(arr, n))
# This code is contributed by mohit kumar 29
C#
// C# program for the above approach
using System;
class GFG{
// Funtion to find the maximum sum
static int MaximumSum(int [,]arr, int n)
{
int ans = 0;
// Loop to traverse through the
// upper triangular matrix and
// update the maximum sum to ans
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;
}
// Traverse through the
// lower triangular matrix
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;
}
// Driver Code
public static void Main(String[] args)
{
// Given matrix
int [,]arr = { { 1, 2, 3 },
{ 3, 5, 10 },
{ 1, 3, 5 } };
// Given dimension
int n = arr.GetLength(0);
Console.Write(MaximumSum(arr, n));
}
}
// This code is contributed by shikhasingrajput
输出:
12
时间复杂度: O(N 2 )
辅助空间: O(N 2 )