DP - minimum adjustment cost

http://www.lintcode.com/en/problem/minimum-adjustment-cost/

Given an integer array, adjust each integers so that the difference of every adjacent 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]|

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.

Note You can assume each number in the array is a positive integer and not greater than 100.

Solution:

State: d[i][v] means for the first i numbers, the minimum cost to adjust number i to v while satisfying the difference smaller than target

transform function:

d[i][v] = min (d[i-1][v'] + abs(a[i]-v), d[i][v]) (|v-v'| <= target)

time complexity O(n A target)

public static int MinAdjustmentCost(ArrayList<Integer> A, int target) {
10         // write your code here
11         if (A == null || A.size() == 0) {
12             return 0;
13         }
14         
15         // D[i][v]: 把index = i的值修改为v,所需要的最小花费
16         int[][] D = new int[A.size()][101];
17         
18         int size = A.size();
19         
20         for (int i = 0; i < size; i++) {
21             for (int j = 1; j <= 100; j++) {
22                 D[i][j] = Integer.MAX_VALUE;
23                 if (i == 0) {
24                     // The first element.
25                     D[i][j] = Math.abs(j - A.get(i));
26                 } else {
27                     for (int k = 1; k <= 100; k++) {
28                         // 不符合条件 
29                         if (Math.abs(j - k) > target) {
30                             continue;
31                         }
32                         
33                         int dif = Math.abs(j - A.get(i)) + D[i - 1][k];
34                         D[i][j] = Math.min(D[i][j], dif);
35                     }
36                 }
37             }
38         }
39         
40         int ret = Integer.MAX_VALUE;
41         for (int i = 1; i <= 100; i++) {
42             ret = Math.min(ret, D[size - 1][i]);
43         }
44         
45         return ret;
46     }
复制代码