Minimum Adjustment Cost

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 }

 

你可能感兴趣的:(ini)