Given an array of positive integers, replace each element in the array such that the difference between adjacent elements in the array is less than or equal to a given target. We need to minimize the adjustment cost, that is the sum of differences between new and old values. We basically need to minimize ∑|A[i] – Anew[i]| where 0 ≤ i ≤ n-1, n is size of A[] and Anew[] is the array with adjacent difference less that or equal to target.
Assume all elements of the array is less than constant M = 100.
Examples:
Input: arr = [1, 3, 0, 3], target = 1
Output: Minimum adjustment cost is 3
Explanation: One of the possible solutions
is [2, 3, 2, 3]
Input: arr = [2, 3, 2, 3], target = 1
Output: Minimum adjustment cost is 0
Explanation: All adjacent elements in the input
array are already less than equal to given target
Input: arr = [55, 77, 52, 61, 39, 6,
25, 60, 49, 47], target = 10
Output: Minimum adjustment cost is 75
Explanation: One of the possible solutions is
[55, 62, 52, 49, 39, 29, 30, 40, 49, 47]
In order to minimize the adjustment cost ∑|A[i] – Anew[i]| for all index i in the array, |A[i] – Anew[i]| should be as close to zero as possible. Also, |A[i] – Anew[i+1] ]| ≤ Target.
This problem can be solved by dynamic programming.
Let dp[i][j] defines minimal adjustment cost on changing A[i] to j, then the DP relation is defined by –
dp[i][j] = min{dp[i - 1][k]} + |j - A[i]|
for all k's such that |k - j| ≤ target
Here, 0 ≤ i ≤ n and 0 ≤ j ≤ M where n is number of elements in the array and M = 100. We have to consider all k such that max(j – target, 0) ≤ k ≤ min(M, j + target)
Finally, the minimum adjustment cost of the array will be min{dp[n – 1][j]} for all 0 ≤ j ≤ M.
Below is the implementation of above idea –
C++
// C++ program to find minimum adjustment cost of an array #include <bits/stdc++.h> using namespace std; #define M 100 // Function to find minimum adjustment cost of an array int minAdjustmentCost(int A[], int n, int target) { // dp[i][j] stores minimal adjustment cost on changing // A[i] to j int dp[n][M + 1]; // handle first element of array separately for (int j = 0; j <= M; j++) dp[0][j] = abs(j - A[0]); // do for rest elements of the array for (int i = 1; i < n; i++) { // replace A[i] to j and calculate minimal adjustment // cost dp[i][j] for (int j = 0; j <= M; j++) { // initialize minimal adjustment cost to INT_MAX dp[i][j] = INT_MAX; // consider all k such that k >= max(j - target, 0) and // k <= min(M, j + target) and take minimum for (int k = max(j-target,0); k <= min(M,j+target); k++) dp[i][j] = min(dp[i][j], dp[i - 1][k] + abs(A[i] - j)); } } // return minimum value from last row of dp table int res = INT_MAX; for (int j = 0; j <= M; j++) res = min(res, dp[n - 1][j]); return res; } // Driver Program to test above functions int main() { int arr[] = {55, 77, 52, 61, 39, 6, 25, 60, 49, 47}; int n = sizeof(arr) / sizeof(arr[0]); int target = 10; cout << "Minimum adjustment cost is " << minAdjustmentCost(arr, n, target) << endl; return 0; } |
Java
// Java program to find minimum adjustment cost of an array import java.io.*; import java.util.*; class GFG { public static int M = 100; // Function to find minimum adjustment cost of an array static int minAdjustmentCost(int A[], int n, int target) { // dp[i][j] stores minimal adjustment cost on changing // A[i] to j int[][] dp = new int[n][M + 1]; // handle first element of array separately for (int j = 0; j <= M; j++) dp[0][j] = Math.abs(j - A[0]); // do for rest elements of the array for (int i = 1; i < n; i++) { // replace A[i] to j and calculate minimal adjustment // cost dp[i][j] for (int j = 0; j <= M; j++) { // initialize minimal adjustment cost to INT_MAX dp[i][j] = Integer.MAX_VALUE; // consider all k such that k >= max(j - target, 0) and // k <= min(M, j + target) and take minimum int k = Math.max(j-target,0); for ( ; k <= Math.min(M,j+target); k++) dp[i][j] = Math.min(dp[i][j], dp[i - 1][k] + Math.abs(A[i] - j)); } } // return minimum value from last row of dp table int res = Integer.MAX_VALUE; for (int j = 0; j <= M; j++) res = Math.min(res, dp[n - 1][j]); return res; } // Driver program public static void main (String[] args) { int arr[] = {55, 77, 52, 61, 39, 6, 25, 60, 49, 47}; int n = arr.length; int target = 10; System.out.println("Minimum adjustment cost is " +minAdjustmentCost(arr, n, target)); } } // This code is contributed by Pramod Kumar |
Python3
# Python3 program to find minimum # adjustment cost of an array M = 100 # Function to find minimum # adjustment cost of an array def minAdjustmentCost(A, n, target): # dp[i][j] stores minimal adjustment # cost on changing A[i] to j dp = [[0 for i in range(M + 1)] for i in range(n)] # handle first element # of array separately for j in range(M + 1): dp[0][j] = abs(j - A[0]) # do for rest elements # of the array for i in range(1, n): # replace A[i] to j and # calculate minimal adjustment # cost dp[i][j] for j in range(M + 1): # initialize minimal adjustment # cost to INT_MAX dp[i][j] = 100000000 # consider all k such that # k >= max(j - target, 0) and # k <= min(M, j + target) and # take minimum for k in range(max(j - target, 0), min(M, j + target) + 1): dp[i][j] = min(dp[i][j], dp[i - 1][k] + abs(A[i] - j)) # return minimum value from # last row of dp table res = 10000000 for j in range(M + 1): res = min(res, dp[n - 1][j]) return res # Driver Code arr= [55, 77, 52, 61, 39, 6, 25, 60, 49, 47] n = len(arr) target = 10print("Minimum adjustment cost is", minAdjustmentCost(arr, n, target), sep = ' ') # This code is contributed # by sahilshelangia |
C#
// C# program to find minimum adjustment // cost of an array using System; class GFG { public static int M = 100; // Function to find minimum adjustment // cost of an array static int minAdjustmentCost(int []A, int n, int target) { // dp[i][j] stores minimal adjustment // cost on changing A[i] to j int[,] dp = new int[n,M + 1]; // handle first element of array // separately for (int j = 0; j <= M; j++) dp[0,j] = Math.Abs(j - A[0]); // do for rest elements of the array for (int i = 1; i < n; i++) { // replace A[i] to j and calculate // minimal adjustment cost dp[i][j] for (int j = 0; j <= M; j++) { // initialize minimal adjustment // cost to INT_MAX dp[i,j] = int.MaxValue; // consider all k such that // k >= max(j - target, 0) and // k <= min(M, j + target) and // take minimum int k = Math.Max(j - target, 0); for ( ; k <= Math.Min(M, j + target); k++) dp[i,j] = Math.Min(dp[i,j], dp[i - 1,k] + Math.Abs(A[i] - j)); } } // return minimum value from last // row of dp table int res = int.MaxValue; for (int j = 0; j <= M; j++) res = Math.Min(res, dp[n - 1,j]); return res; } // Driver program public static void Main () { int []arr = {55, 77, 52, 61, 39, 6, 25, 60, 49, 47}; int n = arr.Length; int target = 10; Console.WriteLine("Minimum adjustment" + " cost is " + minAdjustmentCost(arr, n, target)); } } // This code is contributed by Sam007. |
PHP
<?php // PHP program to find minimum // adjustment cost of an array $M = 100; // Function to find minimum // adjustment cost of an array function minAdjustmentCost( $A, $n, $target) { // dp[i][j] stores minimal // adjustment cost on changing // A[i] to j global $M; $dp = array(array()); // handle first element // of array separately for($j = 0; $j <= $M; $j++) $dp[0][$j] = abs($j - $A[0]); // do for rest // elements of the array for($i = 1; $i < $n; $i++) { // replace A[i] to j and // calculate minimal adjustment // cost dp[i][j] for($j = 0; $j <= $M; $j++) { // initialize minimal adjustment // cost to INT_MAX $dp[$i][$j] = PHP_INT_MAX; // consider all k such that // k >= max(j - target, 0) and // k <= min(M, j + target) and // take minimum for($k = max($j - $target, 0); $k <= min($M, $j + $target); $k++) $dp[$i][$j] = min($dp[$i][$j], $dp[$i - 1][$k] + abs($A[$i] - $j)); } } // return minimum value // from last row of dp table $res = PHP_INT_MAX; for($j = 0; $j <= $M; $j++) $res = min($res, $dp[$n - 1][$j]); return $res; } // Driver Code $arr = array(55, 77, 52, 61, 39, 6, 25, 60, 49, 47); $n = count($arr); $target = 10; echo "Minimum adjustment cost is " , minAdjustmentCost($arr, $n, $target); // This code is contributed by anuj_67. ?> |
Output:
Minimum adjustment cost is 75
This article is contributed by Aditya Goel. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.
Recommended Posts:
- Minimum cost to empty Array where cost of removing an element is 2^(removed_count) * arr[i]
- Minimum cost to reach end of array array when a maximum jump of K index is allowed
- Find the minimum cost to reach destination using a train
- Find minimum cost to buy all books
- Make all array elements equal with minimum cost
- Minimum cost to connect weighted nodes represented as array
- Minimum cost to make array size 1 by removing larger of pairs
- Minimum cost to equal all elements of array using two operation
- Minimum cost of choosing 3 increasing elements in an array of size N
- Minimum cost to make all array elements equal
- Minimum cost of reducing Array by merging any adjacent elements repetitively
- Make array elements equal with minimum cost
- Minimum cost to make an Array a permutation of first N natural numbers
- Minimum cost of choosing the array element
- Minimum Cost to make all array elements equal using given operations
- Minimum cost to sort an Array such that swapping X and Y costs XY
- Split array into subarrays at minimum cost by minimizing count of repeating elements in each subarray
- Find the maximum cost of an array of pairs choosing at most K pairs
- Minimum Cost Polygon Triangulation
- Minimum Cost To Make Two Strings Identical

