📜  通过对角遍历给定矩阵的每个像元来最大化总和

📅  最后修改于: 2021-04-29 13:04:58             🧑  作者: Mango

给定尺寸为N x N的2D方阵arr [] [] ,任务是通过从任意一个单元斜向移动来找到最大路径总和,并且每个单元只能访问一次,即从该单元(i,j)开始访问,玩家可以移至该单元格(i + 1,j + 1)

例子:

方法:解决此问题的想法是对角地遍历第一行和第一列元素的矩阵,并在矩阵范围内求和它们的对角元素。
请按照以下步骤解决问题:

  1. 初始化一个变量,用0表示max
  2. 从第一行和第一列中选择每个单元格(i,j)
  3. 现在,从每个像元中,通过将ij1来表示从该像元开始的对角和,即sum
  4. 然后,将max更新为max(max,sum)
  5. 遍历后,将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 )