Given an integer array, adjust each integers so that the difference of every adjcent integers are not greater than a given number target.
If the array before adjustment is A, the array after adjustment is B, you should minimize the sum of |A[i]-B[i]|
Note
You can assume each number in the array is a positive integer and not greater than 100
Example
Given [1,4,2,3] and target=1, one of the solutions is [2,3,2,3], the adjustment cost is 2 and it's minimal. Return 2.
1 public class Solution { 2 /** 3 * @param A: An integer array. 4 * @param target: An integer. 5 */ 6 public int MinAdjustmentCost(ArrayList<Integer> A, int target) { 7 if(A == null || A.size() < 2) return -1; 8 9 //get max value of array 10 int max = 0; 11 for(int i = 0; i < A.size(); i ++) 12 max = Math.max(max, A.get(i)); 13 14 int[][] arr = new int[A.size()][max + 1]; 15 16 //init: dp[0][v] = |A[0] - v| 17 for(int i = 0; i <= max; i ++) 18 arr[0][i] = Math.abs(i - A.get(0)); 19 20 //dp[i][v] = min(dp[i - 1][v - target … v + target]) + |A[i] - v| 21 for(int j = 1; j < A.size(); j ++){ 22 for(int i = 0; i <= max; i ++){ 23 int minPre = Integer.MAX_VALUE; 24 for(int k = Math.max(0, i - target); k <= Math.min(max, i + target); k ++) 25 minPre = Math.min(minPre, arr[j - 1][k]); 26 arr[j][i] = Math.abs(i - A.get(j)) + minPre; 27 } 28 } 29 int result = Integer.MAX_VALUE; 30 for(int i = 0; i <= max; i ++) 31 result = Math.min(result, arr[A.size() - 1][i]); 32 33 return result; 34 } 35 }