Given two array of N integers arr[] and costArray[], representing removal cost associated with each element. The task is to find the subsequence from the given array of minimum cost such that the sum of the difference between adjacent elements is maximum. On removing each element, cost is incurred.
Examples:
Input: N = 3, arr[] = { 3, 2, 1 }, costArray[] = {0, 1, 0}
Output: 4, 1
Explanation:
There are 4 subsequences of length at least 2 :
[ 3, 2 ] which gives us | 3 – 2 | = 1
[ 3, 1 ] which gives us | 3 – 1 | = 2
[ 2, 1 ] which gives us | 2 – 1 | = 1
[ 3, 2, 1 ] which gives us | 3 – 2 | + | 2 – 1 | = 2
So the answer is either [ 3, 1 ] or [ 3, 2, 1 ] . Since we want the subsequence to be as short as possible, the answer is [ 3, 1 ]. Cost incurrent removing element 2 is 1.
So, the sum of the sequence is 4.
and the cost is 1.
Input: N = 4, arr[] = { 1, 3, 4, 2}, costArray[] = {0, 1, 0, 0}
Output: 7, 1
Naive Approach:
The naive approach is simply to check all the subsequences by generating them by recursion and it takes the complexity of O(2^N) which is very high complexity. And from them choose the subsequence which follows the above condition with maximum absolute sum and a minimum length as mentioned above.
Efficient Approach:
- We can observe the pattern, let us assume three numbers a, b, c such that a = L, b = L + 6, c = L + 10 (L is any integer here). If they are in a continuous pattern one after another eg a, b, c (such that a < b < c).
- Then
| b – a | + | c – b | = | a – c | = 10
- here we can remove the middle element to reduce the size of the original sequence.
- In this way, reducing the size of the array by removing a middle element from the sequence will not affect the sum and also reduce the length of the sequence.
- Stores all the removed elements in the set. Add the cost of removed elements. Finally, calculate the sum sequence by excluding removed elements.
- Then print the sum of elements of subsequence and cost incurred.
In this way, we reduce the exponential complexity O(2^N) to the linear complexity O(N).
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void costOfSubsequence(
int N, int arr[],
int costArray[])
{
int i, temp;
int cost = 0;
set< int > removedElements;
int ans = 0;
for (i = 1; i < (N - 1); i++) {
temp = arr[i];
if (((arr[i - 1] < temp)
&& (temp < arr[i + 1]))
|| ((arr[i - 1] > temp)
&& (temp > arr[i + 1]))) {
removedElements.insert(temp);
}
}
for (i = 0; i < (N); i++) {
temp = arr[i];
if (!(removedElements.count(temp) > 0)) {
ans += arr[i];
}
else {
cost += costArray[i];
}
}
cout << ans << ", " ;
cout << cost << endl;
}
int main()
{
int N;
N = 4;
int arr[N]
= { 1, 3, 4, 2 };
int costArray[N]
= { 0, 1, 0, 0 };
costOfSubsequence(
N, arr,
costArray);
return 0;
}
|
Java
import java.util.*;
class GFG{
public static void costOfSubsequence( int N, int [] arr,
int [] costArray)
{
int i, temp;
int cost = 0 ;
Set<Integer> removedElements = new HashSet<Integer>();
int ans = 0 ;
for (i = 1 ; i < (N - 1 ); i++)
{
temp = arr[i];
if (((arr[i - 1 ] < temp) &&
(temp < arr[i + 1 ])) ||
((arr[i - 1 ] > temp) &&
(temp > arr[i + 1 ])))
{
removedElements.add(temp);
}
}
for (i = 0 ; i < (N); i++)
{
temp = arr[i];
if (!(removedElements.contains(temp)))
{
ans += arr[i];
}
else
{
cost += costArray[i];
}
}
System.out.print(ans + ", " );
System.out.print(cost);
}
public static void main(String[] args)
{
int N;
N = 4 ;
int [] arr = { 1 , 3 , 4 , 2 };
int [] costArray = { 0 , 1 , 0 , 0 };
costOfSubsequence(N, arr, costArray);
}
}
|
Python3
def costOfSubsequence(N, arr, costArray):
i, temp, cost = 0 , 0 , 0
removedElements = {''}
ans = 0
for i in range ( 1 , N - 1 ):
temp = arr[i]
if (((arr[i - 1 ] < temp) and
(temp < arr[i + 1 ])) or
((arr[i - 1 ] > temp) and
(temp > arr[i + 1 ]))) :
removedElements.add(temp)
for i in range ( 0 , N):
temp = arr[i]
if (temp not in removedElements):
ans = ans + arr[i]
else :
cost + = costArray[i]
print (ans, end = ", " )
print (cost)
N = 4
arr = [ 1 , 3 , 4 , 2 ]
costArray = [ 0 , 1 , 0 , 0 ]
costOfSubsequence(N, arr, costArray)
|
C#
using System;
using System.Collections.Generic;
class GFG{
public static void costOfSubsequence( int N, int [] arr,
int [] costArray)
{
int i, temp;
int cost = 0;
HashSet< int > removedElements = new HashSet< int >();
int ans = 0;
for (i = 1; i < (N - 1); i++)
{
temp = arr[i];
if (((arr[i - 1] < temp) &&
(temp < arr[i + 1])) ||
((arr[i - 1] > temp) &&
(temp > arr[i + 1])))
{
removedElements.Add(temp);
}
}
for (i = 0; i < (N); i++)
{
temp = arr[i];
if (!(removedElements.Contains(temp)))
{
ans += arr[i];
}
else
{
cost += costArray[i];
}
}
Console.Write(ans + ", " );
Console.Write(cost);
}
public static void Main(String[] args)
{
int N;
N = 4;
int [] arr = { 1, 3, 4, 2 };
int [] costArray = { 0, 1, 0, 0 };
costOfSubsequence(N, arr, costArray);
}
}
|
Javascript
<script>
function costOfSubsequence(N,arr,costArray)
{
let i, temp;
let cost = 0;
let removedElements = new Set();
let ans = 0;
for (i = 1; i < (N - 1); i++) {
temp = arr[i];
if (((arr[i - 1] < temp)
&& (temp < arr[i + 1]))
|| ((arr[i - 1] > temp)
&& (temp > arr[i + 1]))) {
removedElements.add(temp);
}
}
for (i = 0; i < (N); i++) {
temp = arr[i];
if (!removedElements.has(temp)) {
ans += arr[i];
}
else {
cost += costArray[i];
}
}
document.write(ans + ", " );
document.write(cost);
}
let N;
N = 4;
let arr= [ 1, 3, 4, 2 ];
let costArray= [ 0, 1, 0, 0 ];
costOfSubsequence(N, arr,costArray);
</script>
|
Time Complexity: O(NlogN)
Auxiliary Space: O(N) because it uses extra space for set removedElements