矩阵中自上而下的最大和路

考虑一个n*n矩阵。假设矩阵中的每个单元格都指定了一个值。我们可以从第i行的每个单元格到第i+1行的一个对角线较高的单元格[即从单元格(i,j)到单元格(i+1,j-1)和单元格(i+1,j+1)]。按照上述条件找到从顶行到底行的路径,以获得最大和。

null

例如:

Input : mat[][] = { {5, 6, 1, 7},                {-2, 10, 8, -1},                {3, -7, -9, 11},                {12, -4, 2, 6} }Output : 28{5, 6, 1, 7},{-2, 10, 8, -1},{3, -7, -9, 11},{12, -4, 2, 6} }The highlighted numbers from top to bottomgives the required maximum sum path.(7 + 8 + 11 + 2) = 28

算法: 其思想是找到从第一行的每个单元格开始的最大和或所有路径,最后返回第一行中所有值的最大值。我们使用动态规划,因为许多子问题的结果需要一次又一次地处理。

C++

// C++ implementation to find the maximum sum
// path in a matrix
#include <bits/stdc++.h>
using namespace std;
#define SIZE 10
// function to find the maximum sum
// path in a matrix
int maxSum( int mat[SIZE][SIZE], int n)
{
// if there is a single element only
if (n == 1)
return mat[0][0];
// dp[][] matrix to store the results
// of each iteration
int dp[n][n];
int maxSum = INT_MIN, max;
// base case, copying elements of
// last row
for ( int j = 0; j < n; j++)
dp[n - 1][j] = mat[n - 1][j];
// building up the dp[][] matrix from
// bottom to the top row
for ( int i = n - 2; i >= 0; i--) {
for ( int j = 0; j < n; j++) {
max = INT_MIN;
// finding the maximum diagonal element in the
// (i+1)th row if that cell exists
if (((j - 1) >= 0) && (max < dp[i + 1][j - 1]))
max = dp[i + 1][j - 1];
if (((j + 1) < n) && (max < dp[i + 1][j + 1]))
max = dp[i + 1][j + 1];
// adding that 'max' element to the
// mat[i][j] element
dp[i][j] = mat[i][j] + max;
}
}
// finding the maximum value from the
// first row of dp[][]
for ( int j = 0; j < n; j++)
if (maxSum < dp[0][j])
maxSum = dp[0][j];
// required maximum sum
return maxSum;
}
// Driver program to test above
int main()
{
int mat[SIZE][SIZE] = { { 5, 6, 1, 7 },
{ -2, 10, 8, -1 },
{ 3, -7, -9, 11 },
{ 12, -4, 2, 6 } };
int n = 4;
cout << "Maximum Sum = "
<< maxSum(mat, n);
return 0;
}


JAVA

// Java implementation to find the
// maximum sum path in a matrix
import java.io.*;
class MaxSumPath {
//int mat[][];
// function to find the maximum
// sum path in a matrix
static int maxSum( int [][] mat, int n)
{
// if there is a single element only
if (n == 1 )
return mat[ 0 ][ 0 ];
// dp[][] matrix to store the results
// of each iteration
int dp[][] = new int [n][n];
int maxSum = Integer.MIN_VALUE, max;
// base case, copying elements of
// last row
for ( int j = 0 ; j < n; j++)
dp[n - 1 ][j] = mat[n - 1 ][j];
// building up the dp[][] matrix
// from bottom to the top row
for ( int i = n - 2 ; i >= 0 ; i--) {
for ( int j = 0 ; j < n; j++) {
max = Integer.MIN_VALUE;
// finding the maximum diagonal
// element in the (i+1)th row
// if that cell exists
if (((j - 1 ) >= 0 ) &&
(max < dp[i + 1 ][j - 1 ]))
max = dp[i + 1 ][j - 1 ];
if (((j + 1 ) < n) &&
(max < dp[i + 1 ][j + 1 ]))
max = dp[i + 1 ][j + 1 ];
// adding that 'max' element
// to the mat[i][j] element
dp[i][j] = mat[i][j] + max;
}
}
// finding the maximum value from
// the first row of dp[][]
for ( int j = 0 ; j < n; j++)
if (maxSum < dp[ 0 ][j])
maxSum = dp[ 0 ][j];
// required maximum sum
return maxSum;
}
// Driver code
public static void main (String[] args) {
int mat[][] = { { 5 , 6 , 1 , 7 },
{ - 2 , 10 , 8 , - 1 },
{ 3 , - 7 , - 9 , 11 },
{ 12 , - 4 , 2 , 6 } };
int n = 4 ;
System.out.println( "Maximum Sum = " +
maxSum(mat , n));
}
}
// This code is contributed by Prerna Saini


Python3

# Python3 implementation to find
# the maximum sum path in a matrix
SIZE = 10
INT_MIN = - 10000000
# function to find the maximum sum
# path in a matrix
def maxSum(mat,n):
#if there is a single elementif
#there is a single element only only
if n = = 1 :
return mat[ 0 ][ 0 ]
# dp[][] matrix to store the results
# of each iteration
dp = [[ 0 for i in range (n)] for i in range (n)]
maxSum = INT_MIN
# base case, copying elements of
# last row
for j in range (n):
dp[n - 1 ][j] = mat[n - 1 ][j]
# building up the dp[][] matrix from
# bottom to the top row
for i in range (n - 2 , - 1 , - 1 ):
for j in range (n):
maxi = INT_MIN
# finding the maximum diagonal
# element in the
# (i+1)th row if that cell exists
if ((((j - 1 ) > = 0 ) and
(maxi < dp[i + 1 ][j - 1 ]))):
maxi = dp[i + 1 ][j - 1 ]
if ((((j + 1 ) < n) and
(maxi < dp[i + 1 ][j + 1 ]))):
maxi = dp[i + 1 ][j + 1 ]
# adding that 'max' element to the
# mat[i][j] element
dp[i][j] = mat[i][j] + maxi
# finding the maximum value from the
# first row of dp[][]
for j in range (n):
if (maxSum < dp[ 0 ][j]):
maxSum = dp[ 0 ][j]
# required maximum sum
return maxSum
# Driver program to test above
if __name__ = = '__main__' :
mat = [[ 5 , 6 , 1 , 7 ],
[ - 2 , 10 , 8 , - 1 ],
[ 3 , - 7 , - 9 , 11 ],
[ 12 , - 4 , 2 , 6 ]]
n = 4
print ( "Maximum Sum=" ,maxSum(mat,n))
#This code is contributed by sahilshelangia


C#

// C# implementation to find the
// maximum sum path in a matrix
using System;
class MaxSumPath
{
//int mat[][];
// function to find the maximum
// sum path in a matrix
static int maxSum( int [,] mat, int n)
{
// if there is a single element only
if (n == 1)
return mat[0, 0];
// dp[][] matrix to store the results
// of each iteration
int [,]dp = new int [n, n];
int maxSum = int .MinValue, max;
// base case, copying elements of
// last row
for ( int j = 0; j < n; j++)
dp[n - 1, j] = mat[n - 1, j];
// building up the dp[][] matrix
// from bottom to the top row
for ( int i = n - 2; i >= 0; i--)
{
for ( int j = 0; j < n; j++)
{
max = int .MinValue;
// finding the maximum diagonal
// element in the (i+1)th row
// if that cell exists
if (((j - 1) >= 0) &&
(max < dp[i + 1, j - 1]))
max = dp[i + 1, j - 1];
if (((j + 1) < n) &&
(max < dp[i + 1, j + 1]))
max = dp[i + 1, j + 1];
// adding that 'max' element
// to the mat[i][j] element
dp[i, j] = mat[i, j] + max;
}
}
// finding the maximum value from
// the first row of dp[][]
for ( int j = 0; j < n; j++)
if (maxSum < dp[0, j])
maxSum = dp[0, j];
// required maximum sum
return maxSum;
}
// Driver code
public static void Main () {
int [,]mat = { { 5, 6, 1, 7 },
{ -2, 10, 8, -1 },
{ 3, -7, -9, 11 },
{ 12, -4, 2, 6 } };
int n = 4;
Console.WriteLine( "Maximum Sum = " +
maxSum(mat , n));
}
}
// This code is contributed by vt_m


PHP

<?php
// PHP implementation to find
// the maximum sum path in a matrix
$SIZE = 10;
// function to find the maximum sum
// path in a matrix
function maxSum( $mat , $n )
{
// if there is a single
// element only
if ( $n == 1)
return $mat [0][0];
// dp[][] matrix to store the results
// of each iteration
$dp = array ( array ());
$maxSum = PHP_INT_MIN;
$max ;
// base case, copying elements of
// last row
for ( $j = 0; $j < $n ; $j ++)
$dp [ $n - 1][ $j ] = $mat [ $n - 1][ $j ];
// building up the dp[][] matrix from
// bottom to the top row
for ( $i = $n - 2; $i >= 0; $i --)
{
for ( $j = 0; $j < $n ; $j ++)
{
$max = PHP_INT_MIN;
// finding the maximum
// diagonal element in the
// (i+1)th row if that cell
// exists
if ((( $j - 1) >= 0) and
( $max < $dp [ $i + 1][ $j - 1]))
$max = $dp [ $i + 1][ $j - 1];
if ((( $j + 1) < $n ) and ( $max <
$dp [ $i + 1][ $j + 1]))
$max = $dp [ $i + 1][ $j + 1];
// adding that 'max' element to the
// mat[i][j] element
$dp [ $i ][ $j ] = $mat [ $i ][ $j ] + $max ;
}
}
// finding the maximum value from the
// first row of dp[][]
for ( $j = 0; $j < $n ; $j ++)
if ( $maxSum < $dp [0][ $j ])
$maxSum = $dp [0][ $j ];
// required maximum sum
return $maxSum ;
}
// Driver Code
$mat = array ( array (5, 6, 1, 7),
array (-2, 10, 8, -1),
array (3, -7, -9, 11),
array (12, -4, 2, 6));
$n = 4;
echo "Maximum Sum = "
, maxSum( $mat , $n );
// This code is contributed by anuj_67.
?>


Javascript

<script>
// JavaScript implementation to find the
// maximum sum path in a matrix
// Function to find the maximum
// sum path in a matrix
function maxSum(mat, n)
{
// If there is a single element only
if (n == 1)
return mat[0][0];
// dp[][] matrix to store the results
// of each iteration
let dp = new Array(n);
// Loop to create 2D array using 1D array
for ( var i = 0; i < dp.length; i++)
{
dp[i] = new Array(2);
}
let maxSum = Number.MIN_VALUE, max;
// Base case, copying elements of
// last row
for (let j = 0; j < n; j++)
dp[n - 1][j] = mat[n - 1][j];
// Building up the dp[][] matrix
// from bottom to the top row
for (let i = n - 2; i >= 0; i--)
{
for (let j = 0; j < n; j++)
{
max = Number.MIN_VALUE;
// Finding the maximum diagonal
// element in the (i+1)th row
// if that cell exists
if (((j - 1) >= 0) &&
(max < dp[i + 1][j - 1]))
max = dp[i + 1][j - 1];
if (((j + 1) < n) &&
(max < dp[i + 1][j + 1]))
max = dp[i + 1][j + 1];
// Adding that 'max' element
// to the mat[i][j] element
dp[i][j] = mat[i][j] + max;
}
}
// Finding the maximum value from
// the first row of dp[][]
for (let j = 0; j < n; j++)
if (maxSum < dp[0][j])
maxSum = dp[0][j];
// Required maximum sum
return maxSum;
}
// Driver Code
let mat = [ [ 5, 6, 1, 7 ],
[ -2, 10, 8, -1 ],
[ 3, -7, -9, 11 ],
[ 12, -4, 2, 6 ] ];
let n = 4;
document.write( "Maximum Sum = " +
maxSum(mat , n));
// This code is contributed by sanjoy_62
</script>


输出:

Maximum Sum = 28

时间复杂度:O(n) 2. ). 辅助空间:O(n) 2. ).

练习: 试着在O(n)的辅助空间中求解。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享