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 isA, the array after adjustment isB, you should minimize the sum of|A[i]-B[i]|

Notice

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

Example

Given[1,4,2,3]and target =1, one of the solutions is[2,3,2,3], the adjustment cost is2and it's minimal.

Return2.

Solution 1: DFS

public int MinAdjustmentCost(ArrayList<Integer> A, int target) {
    if(A.size() == 0) {
        return 0;
    }
    return dfs(A, target, new ArrayList<Integer>(A), 0);
}
public int dfs(ArrayList<Integer> A,
               ArrayList<Integer> B,
               int target,
               int index) {
    if(index >= A.size()) {
        return 0;
    }
    int diff = 0;
    int min = Integer.MAX_VALUE;
    for(int i = 0; i <= 100; i++) {
        if(index != 0 && Math.abs(i - B.get(index - 1)) > target)
            continue;
        B.set(index, i);
        diff = Math.abs(i - A.get(index));
        diff += dfs(A, B, target, index + 1);
        min = Math.min(min, diff);
        B.set(index, A.get(index));
    }
    return min;
}

Solution 2: Memory Search.

public int MinAdjustmentCost(ArrayList<Integer> A, int target) {
    if(A.size() == 0) {
        return 0;
    }
    int[][] dp = new int[101][A.size()];
    for(int i = 0; i < 101; i++) {
        for(int j = 0; j < A.size(); j++) {
            dp[i][j] = -1;    
        }
    }
    return memory(A, target, new ArrayList<Integer>(A), 0, dp);   
}
public int memory(ArrayList<Integer> A, int target, ArrayList<Integer> B, int index, int[][] dp) {
    if(index == A.size()) {
        return 0;
    }
    int diff = 0, min = Integer.MAX_VALUE;
    for(int i = 0; i <= 100; i++) {
        if(index > 0 && Math.abs(i - B.get(index - 1)) > target) {
            continue;
        }
        if(dp[i][index] != -1) {
            diff = dp[i][index];
            min = Math.min(min, diff);
            continue;
        }
        B.set(index, i);
        diff = Math.abs(i - A.get(index));
        diff += memory(A, target, B, index + 1, dp);
        dp[i][index] = diff;
        min = Math.min(min, diff);
        B.set(index, A.get(index));
    }
    return min;
}

Solution 3:

public int MinAdjustmentCost(ArrayList<Integer> A, int target) {
    if(A.size() == 0) {
        return 0;
    }
    int[][] dp = new int[A.size()][101];
    int min = Integer.MAX_VALUE, diff = 0;
    for(int i = 0; i < A.size(); i++) {
        for(int j = 0; j < 101; j++) {
            dp[i][j] = Integer.MAX_VALUE;
            if(i == 0) {
                dp[i][j] = Math.abs(j - A.get(i));
            }
            else {
                for(int k = 0; k < 101; k++) {
                    if(Math.abs(j - k) > target) {
                        continue;
                    }
                    diff = Math.abs(j - A.get(i)) + dp[i - 1][k];
                    dp[i][j] = Math.min(dp[i][j], diff);
                }
            }
        }
    }
    for(int i = 0; i <= 100; i++) {
        min = Math.min(min, dp[A.size() - 1][i]);
    }
    return min;
}

results matching ""

    No results matching ""