There are ‘N’ diamonds in a mine. The size of each diamond is given in the form of integer array ‘A’. If the miner mines a diamond, then he gets 'size of previous unmined diamond * size of currently mined diamond * size of next unmined diamond' number of coins. If there isn’t any next or previous unmined diamond then their size is replaced by 1 while calculating the number of coins.
Vladimir, a dumb miner was assigned the task to mine all diamonds. Since he is dumb he asks for your help to determine the maximum number of coins that he can earn by mining the diamonds in an optimal order.
For example: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.
Input Format:
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.
Output Format:
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.
Note:
You are not required to print anything; it has already been taken care of. Just implement the function and return the answer.
Constraints:
1 ≤ T ≤ 100
1 ≤ N ≤ 100
0 ≤ A[i] ≤ 100
1 ≤ ΣN ≤ 300
Time limit: 1 Sec
2
3
7 1 8
2
9 1
120
18
For First Case - Same as explained in above example.
For the second case -
‘N’ = 2, and ‘A’ = [9, 1]
The optimal order for mining diamonds will be [2, 1].
State of mine - [9, 1] [9]
Coins earned - (1*9*1) + (1*9*1) = 9 + 9 = 18
Hence output will be 18..
2
5
1 2 3 4 5
4
1 5 2 8
110
136
Can we iterate over all the possible ways to mine diamonds?
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.
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)
O(N!) where N is the number of diamonds.
Time complexity will be equal to solving the following recurrence. T(n) = n * T(n-1) + O(1). Hence total time will be O(N!). This is a very slow algorithm.
O(N) where N is the number of diamonds.
We only need extra space for the recursion stack, which will be at most O(N) in its size. So total space required will be O(N).