给定N x N矩阵mat [] [] ,任务是找到给定矩阵的任何子矩阵可能的最大迹线。
例子:
Input: mat[][] = {
{10, 2, 5},
{6, 10, 4},
{2, 7, -10}}
Output: 20
{{10, 2},
{6, 10}}
is the sub-matrix with the maximum trace.
Input: mat[][] = {
{1, 2, 5},
{6, 3, 4},
{2, 7, 1}}
Output: 13
方法:一种有效的方法是从矩阵的每个元素沿对角线获取和并更新最大和,因为任何方阵的迹线都是其主对角线上的元素之和。
下面是上述方法的实现:
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