我们以三角形的形式给出了数字,方法是从三角形的顶部开始,移至下一行的相邻数字,从上到下找到最大的总数。
例子 :
Input :
3
7 4
2 4 6
8 5 9 3
Output : 23
Explanation : 3 + 7 + 4 + 9 = 23
Input :
8
-4 4
2 2 6
1 1 1 1
Output : 19
Explanation : 8 + 4 + 6 + 1 = 19
我们可以通过检查每条可能的路径来克服这种蛮力,但这花了很多时间,因此我们应该尝试借助动态编程来解决此问题,从而降低时间复杂度。
如果我们应该将每个元素左移并在每个空白位置放0以使其成为规则矩阵,那么我们的问题就好像是最小成本路径。
因此,在将输入三角形元素转换成规则矩阵之后,我们应该应用动态编程概念来找到最大路径总和。
以自下而上的方式应用DP,我们应该解决以下问题:
例子:
3
7 4
2 4 6
8 5 9 3
Step 1 :
3 0 0 0
7 4 0 0
2 4 6 0
8 5 9 3
Step 2 :
3 0 0 0
7 4 0 0
10 13 15 0
Step 3 :
3 0 0 0
20 19 0 0
Step 4:
23 0 0 0
output : 23
C++
// C++ program for Dynamic
// Programming implementation of
// Max sum problem in a triangle
#include
using namespace std;
#define N 3
// Function for finding maximum sum
int maxPathSum(int tri[][N], int m, int n)
{
// loop for bottom-up calculation
for (int i=m-1; i>=0; i--)
{
for (int j=0; j<=i; j++)
{
// for each element, check both
// elements just below the number
// and below right to the number
// add the maximum of them to it
if (tri[i+1][j] > tri[i+1][j+1])
tri[i][j] += tri[i+1][j];
else
tri[i][j] += tri[i+1][j+1];
}
}
// return the top element
// which stores the maximum sum
return tri[0][0];
}
/* Driver program to test above functions */
int main()
{
int tri[N][N] = { {1, 0, 0},
{4, 8, 0},
{1, 5, 3} };
cout << maxPathSum(tri, 2, 2);
return 0;
}
Java
// Java Program for Dynamic
// Programming implementation of
// Max sum problem in a triangle
import java.io.*;
class GFG {
static int N = 3;
// Function for finding maximum sum
static int maxPathSum(int tri[][], int m, int n)
{
// loop for bottom-up calculation
for (int i = m - 1; i >= 0; i--)
{
for (int j = 0; j <= i; j++)
{
// for each element, check both
// elements just below the number
// and below right to the number
// add the maximum of them to it
if (tri[i + 1][j] > tri[i + 1][j + 1])
tri[i][j] += tri[i + 1][j];
else
tri[i][j] += tri[i + 1][j + 1];
}
}
// return the top element
// which stores the maximum sum
return tri[0][0];
}
/* Driver program to test above functions */
public static void main (String[] args)
{
int tri[][] = { {1, 0, 0},
{4, 8, 0},
{1, 5, 3} };
System.out.println ( maxPathSum(tri, 2, 2));
}
}
// This code is contributed by vt_m
Python3
# Python program for
# Dynamic Programming
# implementation of Max
# sum problem in a
# triangle
N = 3
# Function for finding maximum sum
def maxPathSum(tri, m, n):
# loop for bottom-up calculation
for i in range(m-1, -1, -1):
for j in range(i+1):
# for each element, check both
# elements just below the number
# and below right to the number
# add the maximum of them to it
if (tri[i+1][j] > tri[i+1][j+1]):
tri[i][j] += tri[i+1][j]
else:
tri[i][j] += tri[i+1][j+1]
# return the top element
# which stores the maximum sum
return tri[0][0]
# Driver program to test above function
tri = [[1, 0, 0],
[4, 8, 0],
[1, 5, 3]]
print(maxPathSum(tri, 2, 2))
# This code is contributed
# by Soumen Ghosh.
C#
// C# Program for Dynamic Programming
// implementation of Max sum problem
// in a triangle
using System;
class GFG {
// Function for finding maximum sum
static int maxPathSum(int [,]tri,
int m, int n)
{
// loop for bottom-up calculation
for (int i = m - 1; i >= 0; i--)
{
for (int j = 0; j <= i; j++)
{
// for each element,
// check both elements
// just below the number
// and below right to
// the number add the
// maximum of them to it
if (tri[i + 1,j] >
tri[i + 1,j + 1])
tri[i,j] +=
tri[i + 1,j];
else
tri[i,j] +=
tri[i + 1,j + 1];
}
}
// return the top element
// which stores the maximum sum
return tri[0,0];
}
/* Driver program to test above
functions */
public static void Main ()
{
int [,]tri = { {1, 0, 0},
{4, 8, 0},
{1, 5, 3} };
Console.Write (
maxPathSum(tri, 2, 2));
}
}
// This code is contributed by nitin mittal.
PHP
= 0; $i--)
{
for ($j = 0; $j <= $i; $j++)
{
// for each element, check
// both elements just below
// the number and below right
// to the number add the maximum
// of them to it
if ($tri[$i + 1][$j] > $tri[$i + 1]
[$j + 1])
$tri[$i][$j] += $tri[$i + 1][$j];
else
$tri[$i][$j] += $tri[$i + 1]
[$j + 1];
}
}
// return the top element
// which stores the maximum sum
return $tri[0][0];
}
// Driver Code
$tri= array(array(1, 0, 0),
array(4, 8, 0),
array(1, 5, 3));
echo maxPathSum($tri, 2, 2);
// This code is contributed by ajit
?>
Javascript
输出 :
14