📜  给定矩阵的任何子矩阵可能的最大迹线

📅  最后修改于: 2021-04-23 18:12:26             🧑  作者: Mango

给定N x N矩阵mat [] [] ,任务是找到给定矩阵的任何子矩阵可能的最大迹线。

例子:

方法:一种有效的方法是从矩阵的每个元素沿对角线获取和并更新最大和,因为任何方阵的迹线都是其主对角线上的元素之和。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
#define N 3
  
// Function to return the maximum trace possible
// for a sub-matrix of the given matrix
int MaxTraceSub(int mat[][N])
{
    int max_trace = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            int r = i, s = j, trace = 0;
  
            // Calculate the trace for each of
            // the sub-matrix with top left corner
            // at cell (r, s)
            while (r < N && s < N) {
                trace += mat[r][s];
                r++;
                s++;
  
                // Update the maximum trace
                max_trace = max(trace, max_trace);
            }
        }
    }
  
    // Return the maximum trace
    return max_trace;
}
  
// Driver code
int main()
{
    int mat[N][N] = { { 10, 2, 5 },
                      { 6, 10, 4 },
                      { 2, 7, -10 } };
    cout << MaxTraceSub(mat);
  
    return 0;
}


Java
// Java program for the above approach
class GFG 
{
      
static int N = 3;
  
// Function to return the maximum trace possible
// for a sub-matrix of the given matrix
static int MaxTraceSub(int mat[][])
{
    int max_trace = 0;
    for (int i = 0; i < N; i++) 
    {
        for (int j = 0; j < N; j++) 
        {
            int r = i, s = j, trace = 0;
  
            // Calculate the trace for each of
            // the sub-matrix with top left corner
            // at cell (r, s)
            while (r < N && s < N) 
            {
                trace += mat[r][s];
                r++;
                s++;
  
                // Update the maximum trace
                max_trace = Math.max(trace, max_trace);
            }
        }
    }
  
    // Return the maximum trace
    return max_trace;
}
  
// Driver code
public static void main(String[] args)
{
        int mat[][] = { { 10, 2, 5 },
                    { 6, 10, 4 },
                    { 2, 7, -10 } };
    System.out.println(MaxTraceSub(mat));
}
}
  
// This code has been contributed by 29AjayKumar


Python3
# Python 3 implementation of the approach
N = 3
  
# Function to return the maximum trace possible
# for a sub-matrix of the given matrix
def MaxTraceSub(mat):
    max_trace = 0
    for i in range(N):
        for j in range(N):
            r = i
            s = j
            trace = 0
  
            # Calculate the trace for each of
            # the sub-matrix with top left corner
            # at cell (r, s)
            while (r < N and s < N):
                trace += mat[r]
                r += 1
                s += 1
  
                # Update the maximum trace
                max_trace = max(trace, max_trace)
  
    # Return the maximum trace
    return max_trace
  
# Driver code
if __name__ == '__main__':
    mat = [[10, 2, 5],[6, 10, 4],[2, 7, -10]]
    print(MaxTraceSub(mat))
  
# This code is contributed by
# Surendra_Gangwar


C#
// C# program for the above approach
using System;
  
class GFG 
{
      
static int N = 3;
  
// Function to return the maximum trace possible
// for a sub-matrix of the given matrix
static int MaxTraceSub(int [][]mat)
{
    int max_trace = 0;
    for (int i = 0; i < N; i++) 
    {
        for (int j = 0; j < N; j++) 
        {
            int r = i, s = j, trace = 0;
  
            // Calculate the trace for each of
            // the sub-matrix with top left corner
            // at cell (r, s)
            while (r < N && s < N) 
            {
                trace += mat[r][s];
                r++;
                s++;
  
                // Update the maximum trace
                max_trace = Math.Max(trace, max_trace);
            }
        }
    }
  
    // Return the maximum trace
    return max_trace;
}
  
// Driver code
public static void Main()
{
    int[][] mat = new int[][]{new int[]{ 10, 2, 5 },
                new int[]{ 6, 10, 4 },
                new int[]{ 2, 7, -10 } };
    Console.WriteLine(MaxTraceSub(mat));
}
}
  
// This code has been contributed
// by Akanksha Rai


PHP


输出:
20