
Suppose ‘N’ = 3, and ‘A’ = [7, 1, 8]
The optimal order for mining diamonds will be [2, 1, 3].
State of mine - [7, 1, 8] [7, 8] [8]
Coins earned - (7*1*8) + (1*7*8) + (1*8*1) = 56 + 56 + 8 = 120
Hence output will be 120.
The first line of the input contains a single integer ‘T’ representing the no. of test cases.
The first line of each test case contains a single integer value, ‘N’, denoting the number of diamonds in the mine.
The second line of each test case contains ‘N’ space-separated integers, denoting the size of the diamonds in the mine.
For each test case, print a single integer value denoting the maximum number of coins that can be earned by mining the diamonds in an optimal order.
Print a separate line for each test case.
You are not required to print anything; it has already been taken care of. Just implement the function and return the answer.
1 ≤ T ≤ 100
1 ≤ N ≤ 100
0 ≤ A[i] ≤ 100
1 ≤ ΣN ≤ 300
Time limit: 1 Sec
We can recursively iterate over all the possible ways to mine diamonds. We can create a recursive function that returns the maximum coins earned for a subarray. We can recursively calculate the answer for all the subarrays from which we can construct the current subarray. Out of all the possible ways to mine the current subarray we will choose the one in which the number of coins is maximized. Implementation details are as per the following algorithm.
maxCoinsRec
Function arguments - integer array ‘A’ containing the size of all the diamonds, the starting index ‘i’ of the current subarray, the ending index ‘j’ of the current subarray.
Returns - Maximum number of coins that can be obtained by mining the current subarray.
Given Function(a)
We are doing a lot of duplicate calls to the recursive function and calculating the same thing multiple times. We can eliminate this by using a table that contains answers for all the previous calls to the function. We will just return the value saved in the lookup table if we have already solved it for a particular subarray. Implementation details are as per the following algorithm.
maxCoinsRec
Function arguments - integer array ‘A’ containing the size of all the diamonds, lookup ‘table’ for storing data of already solved subproblems, the starting index ‘i’ of the current subarray, the ending index ‘j’ of the current subarray.
Returns - Maximum number of coins that can be obtained by mining the current subarray.
Given Function(A)
We are doing a lot of duplicate calls to the recursive function and calculating the same thing multiple times. We can eliminate this by using an iterative Dynamic Programming approach.
We will iterate on all the subarrays in increasing order of their lengths and store the maximum coins for each subarray which will be used to calculate maximum coins for bigger subarrays. Implementation details are as per the following algorithm.
The steps are as follows: