我们获得了N个气球,每个气球都带有与之关联的许多硬币。在使气球i爆裂时,获得的硬币数量等于A [i-1] * A [i] * A [i + 1]。而且,气球i-1和i + 1现在变得相邻。找到所有气球破裂后获得的最大可能利润。在每个边界处假设一个额外的1。
例子:
Input : 5, 10
Output : 60
Explanation - First Burst 5, Coins = 1*5*10
Then burst 10, Coins+= 1*10*1
Total = 60
Input : 1, 2, 3, 4, 5
Output : 110
这里讨论一个递归解决方案。我们可以使用动态编程解决此问题。
首先,考虑索引从左到右(含)的子数组。
如果我们假设索引为Last的气球是该子数组中最后一个要破裂的气球,则可以说造币后的硬币为-A [left-1] * A [last] * A [right + 1]。
同样,获得的总硬币数将是该值加上dp [left] [last – 1] + dp [last + 1] [right],其中dp [i] [j]表示具有索引的子阵列获得的最大硬币我,j。
因此,对于Left和Right的每个值,我们需要找到并选择获得最大硬币的Last值,并更新dp数组。
我们的答案是dp [1] [N]上的值。
C++
// C++ program burst balloon problem
#include
#include
using namespace std;
int getMax(int A[], int N)
{
// Add Bordering Balloons
int B[N + 2];
B[0] = 1;
B[N + 1] = 1;
for (int i = 1; i <= N; i++)
B[i] = A[i - 1];
// Declare DP Array
int dp[N + 2][N + 2];
memset(dp, 0, sizeof(dp));
for (int length = 1; length < N + 1; length++)
{
for (int left = 1; left < N - length + 2; left++)
{
int right = left + length - 1;
// For a sub-array from indices left, right
// This innermost loop finds the last balloon burst
for (int last = left; last < right + 1; last++)
{
dp[left][right] = max(dp[left][right],
dp[left][last - 1] +
B[left - 1] * B[last] * B[right + 1] +
dp[last + 1][right]);
}
}
}
return dp[1][N];
}
// Driver code
int main()
{
int A[] = { 1, 2, 3, 4, 5 };
// Size of the array
int N = sizeof(A) / sizeof(A[0]);
// Calling function
cout << getMax(A, N) << endl;
}
// This code is contributed by ashutosh450
Java
// Java program to illustrate
// Burst balloon problem
import java.util.Arrays;
class GFG{
public static int getMax(int[] A, int N)
{
// Add Bordering Balloons
int[] B = new int[N + 2];
B[0] = B[N + 1] = 1;
for(int i = 1; i <= N; i++)
B[i] = A[i - 1];
// Declaring DP array
int[][] dp = new int[N + 2][N + 2];
for(int length = 1;
length < N + 1; length++)
{
for(int left = 1;
left < N - length + 2; left++)
{
int right = left + length -1;
// For a sub-array from indices
// left, right. This innermost
// loop finds the last balloon burst
for(int last = left;
last < right + 1; last++)
{
dp[left][right] = Math.max(
dp[left][right],
dp[left][last - 1] +
B[left - 1] * B[last] *
B[right + 1] +
dp[last + 1][right]);
}
}
}
return dp[1][N];
}
// Driver code
public static void main(String args[])
{
int[] A = { 1, 2, 3, 4, 5 };
// Size of the array
int N = A.length;
// Calling funtion
System.out.println(getMax(A, N));
}
}
// This code is contributed by dadi madhav
Python3
# Python3 program burst balloon problem.
def getMax(A):
N = len(A)
A = [1] + A + [1]# Add Bordering Balloons
dp = [[0 for x in range(N + 2)] for y in range(N + 2)]# Declare DP Array
for length in range(1, N + 1):
for left in range(1, N-length + 2):
right = left + length -1
# For a sub-array from indices left, right
# This innermost loop finds the last balloon burst
for last in range(left, right + 1):
dp[left][right] = max(dp[left][right], \
dp[left][last-1] + \
A[left-1]*A[last]*A[right + 1] + \
dp[last + 1][right])
return(dp[1][N])
# Driver code
A = [1, 2, 3, 4, 5]
print(getMax(A))
C#
// C# program to illustrate
// Burst balloon proble
using System;
class GFG{
public static int getMax(int[] A, int N)
{
// Add Bordering Balloons
int[] B = new int[N + 2];
B[0] = B[N + 1] = 1;
for(int i = 1; i <= N; i++)
B[i] = A[i - 1];
// Declaring DP array
int[,] dp = new int[(N + 2), (N + 2)];
for(int length = 1;
length < N + 1; length++)
{
for(int left = 1;
left < N - length + 2; left++)
{
int right = left + length -1;
// For a sub-array from indices
// left, right. This innermost
// loop finds the last balloon burst
for(int last = left;
last < right + 1; last++)
{
dp[left, right] = Math.Max(
dp[left, right],
dp[left, last - 1] +
B[left - 1] * B[last] *
B[right + 1] +
dp[last + 1, right]);
}
}
}
return dp[1, N];
}
// Driver code
public static void Main()
{
int[] A = new int[] { 1, 2, 3, 4, 5 };
// Size of the array
int N = A.Length;
// Calling function
Console.WriteLine(getMax(A, N));
}
}
// This code is contributed by sanjoy_62
输出:
110
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。