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:
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 –
Finally, the minimum adjustment cost of the array will be min{dp[n – 1][j]} for all 0 <= j <= M.
Below is C++ implementation of above idea –
Output:
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]
We strongly recommend you to minimize your browser and try this yourself first.
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| <= targetHere, 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 C++ implementation of above idea –
// 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 seperately 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; } |
Minimum adjustment cost is 75
No comments:
Post a Comment