Given a number N representing the length of a bracket sequence consisting of brackets ‘(‘, ‘)’. The actual sequence is not known beforehand. Given the values of both brackets ‘(‘ and ‘)’ if placed at index
in the expression.
The task is to find the minimum sum possible of any bracket sequence of length N using the above information.
Here adj[i][0] represents the value assigned to ‘)’ bracket at ith index and adj[i][1] represents the value assigned to ‘(‘ bracket at ith index.
Constraints:
- There should be N/2 pairs made of brackets. That is, N/2 pairs of ‘(‘, ‘)’.
- Find minimum sum of proper bracket expression.
- Index starts from 0.
Examples:
Input : N = 4
adj[N][2] ={{5000, 3000},
{6000, 2000},
{8000, 1000},
{9000, 6000}}
Output : 19000
Assigning first index as '(' for proper
bracket expression is (_ _ _ .
Now all the possible bracket expressions are ()() and (()).
where '(' denotes as adj[i][1] and ')' denotes as adj[i][0].
Hence, for ()() sum is 3000+6000+1000+9000=19000.
and (()), sum is 3000+2000+8000+9000=220000.
Thus answer is 19000
Input : N = 4
adj[N][2] = {{435, 111},
{43, 33},
{1241, 1111},
{234, 22}}
Output : 1499
Algorithm:
- The first element of the bracket sequence can only be ‘(‘, hence value of adj[0][1] is only of use at index 0.
- Call a function to find a proper bracket expression using dp as discussed in this article.
- Denote ‘(‘ as adj[i][1] and ‘)’ as a adj[i][0].
- Find the minimum sum of all possible correct bracket expressions.
- Return the answer + adj[0][1].
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define MAX_VAL 10000000
int dp[100][100];
int find( int index, int openbrk, int n, int adj[][2])
{
if (openbrk < 0)
return MAX_VAL;
if (index == n) {
if (openbrk == 0) {
return 0;
}
else
return MAX_VAL;
}
if (dp[index][openbrk] != -1)
return dp[index][openbrk];
dp[index][openbrk] = min(adj[index][1] + find(index + 1,
openbrk + 1, n, adj),
adj[index][0] + find(index + 1,
openbrk - 1, n, adj));
return dp[index][openbrk];
}
int main()
{
int n = 4;
int adj[n][2] = { { 5000, 3000 },
{ 6000, 2000 },
{ 8000, 1000 },
{ 9000, 6000 } };
memset (dp, -1, sizeof (dp));
cout << find(1, 1, n, adj) + adj[0][1] << endl;
return 0;
}
|
Java
public class GFG {
final static int MAX_VAL = 10000000 ;
static int dp[][] = new int [ 100 ][ 100 ];
static int find( int index, int openbrk, int n, int adj[][])
{
if (openbrk < 0 )
return MAX_VAL;
if (index == n) {
if (openbrk == 0 ) {
return 0 ;
}
else
return MAX_VAL;
}
if (dp[index][openbrk] != - 1 )
return dp[index][openbrk];
dp[index][openbrk] = Math.min(adj[index][ 1 ] + find(index + 1 ,
openbrk + 1 , n, adj),
adj[index][ 0 ] + find(index + 1 ,
openbrk - 1 , n, adj));
return dp[index][openbrk];
}
public static void main(String args[])
{
int n = 4 ;
int adj[][] = { { 5000 , 3000 },
{ 6000 , 2000 },
{ 8000 , 1000 },
{ 9000 , 6000 } };
for ( int i = 0 ; i < dp.length; i ++)
for ( int j = 0 ; j < dp.length; j++)
dp[i][j] = - 1 ;
System.out.println(find( 1 , 1 , n, adj) + adj[ 0 ][ 1 ]);
}
}
|
Python3
MAX_VAL = 10000000
dp = [[ - 1 for i in range ( 100 )]
for i in range ( 100 )]
def find(index, openbrk, n, adj):
if (openbrk < 0 ):
return MAX_VAL
if (index = = n):
if (openbrk = = 0 ):
return 0
else :
return MAX_VAL
if (dp[index][openbrk] ! = - 1 ):
return dp[index][openbrk]
dp[index][openbrk] = min (adj[index][ 1 ] + find(index + 1 ,
openbrk + 1 , n, adj),
adj[index][ 0 ] + find(index + 1 ,
openbrk - 1 , n, adj))
return dp[index][openbrk]
if __name__ = = '__main__' :
n = 4 ;
adj = [[ 5000 , 3000 ],[ 6000 , 2000 ],
[ 8000 , 1000 ],[ 9000 , 6000 ]]
print (find( 1 , 1 , n, adj) + adj[ 0 ][ 1 ])
|
C#
using System;
class GFG
{
public static int MAX_VAL = 10000000;
public static int [,] dp = new int [100,100];
public static int find( int index, int openbrk, int n, int [,] adj)
{
/// Not a proper bracket expression
if (openbrk < 0)
return MAX_VAL;
if (index == n) {
/// If proper bracket expression
if (openbrk == 0) {
return 0;
}
else
return MAX_VAL;
}
if (dp[index,openbrk] != -1)
return dp[index,openbrk];
dp[index,openbrk] = Math.Min(adj[index,1] + find(index + 1,
openbrk + 1, n, adj),
adj[index,0] + find(index + 1,
openbrk - 1, n, adj));
return dp[index,openbrk];
}
static void Main()
{
int n = 4;
int [,] adj = new int [,]{
{ 5000, 3000 },
{ 6000, 2000 },
{ 8000, 1000 },
{ 9000, 6000 }
};
for ( int i = 0; i < 100; i++)
for ( int j = 0; j < 100; j++)
dp[i,j] = -1;
Console.Write(find(1, 1, n, adj) + adj[0,1] + "\n" );
}
}
|
PHP
<?php
$MAX_VAL = 10000000;
$dp = array_fill (0, 100,
array_fill (0, 100, -1));
function find( $index , $openbrk , $n , $adj )
{
global $MAX_VAL ;
global $dp ;
if ( $openbrk < 0)
return $MAX_VAL ;
if ( $index == $n )
{
if ( $openbrk == 0)
{
return 0;
}
else
return $MAX_VAL ;
}
if ( $dp [ $index ][ $openbrk ] != -1)
return $dp [ $index ][ $openbrk ];
$dp [ $index ][ $openbrk ] = min( $adj [ $index ][1] +
find( $index + 1, $openbrk + 1, $n , $adj ),
$adj [ $index ][0] +
find( $index + 1, $openbrk - 1, $n , $adj ));
return $dp [ $index ][ $openbrk ];
}
$n = 4;
$adj = array ( array (5000, 3000),
array (6000, 2000),
array (8000, 1000),
array (9000, 6000));
echo find(1, 1, $n , $adj ) + $adj [0][1];
?>
|
Javascript
<script>
let MAX_VAL = 10000000 ;
let dp = new Array(100);
for (let i = 0; i < 100; i++)
{
dp[i] = new Array(100);
for (let j = 0; j < 100; j++)
{
dp[i][j] = 0;
}
}
function find(index, openbrk, n, adj)
{
if (openbrk < 0)
return MAX_VAL;
if (index == n) {
if (openbrk == 0) {
return 0;
}
else
return MAX_VAL;
}
if (dp[index][openbrk] != -1)
return dp[index][openbrk];
dp[index][openbrk] = Math.min(adj[index][1] + find(index + 1,
openbrk + 1, n, adj),
adj[index][0] + find(index + 1,
openbrk - 1, n, adj));
return dp[index][openbrk];
}
let n = 4;
let adj = [ [ 5000, 3000 ],
[ 6000, 2000 ],
[ 8000, 1000 ],
[ 9000, 6000 ] ];
for (let i = 0; i < dp.length; i ++)
for (let j = 0; j < dp.length; j++)
dp[i][j] = -1 ;
document.write(find(1, 1, n, adj) + adj[0][1]);
</script>
|
Time Complexity: O(N2)