1. 程式人生 > >Minimum Adjustment Cost

Minimum Adjustment Cost

one () nbsp urn htm 容易 targe mina posit

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]| Notice You can assume each number in the array is
a positive integer and not greater than 100. Have you met this question in a real interview? Yes Example Given [1,4,2,3] and target = 1, one of the solutions is [2,3,2,3], the adjustment cost is 2 and its minimal. Return 2.

這道題要看出是背包問題,不容易,跟FB一面 paint house很像,比那個難一點

定義res[i][j] 表示前 i個number with 最後一個number是j,這樣的minimum adjusting cost

public int MinAdjustmentCost(ArrayList<Integer> A, int target) {
        // write your code here
        // 前i-1 個數調整後並且第i-1個數調整為j的cost
        int n = A.size();
        int[][] f = new int[n + 1][101];
        
        // initialize
        for (int i = 0; i <= 100; i++) {
            f[0][i] = 0;
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= 100; j++) {
                f[i][j] = Integer.MAX_VALUE;
            }
        }
        //
        //function
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= 100; j++) {
                for (int k = 0; k <= 100; k++) {
                    if (Math.abs(j - k) <= target) {
                        
                            f[i][k] = Math.min(f[i][k], f[i - 1][j] + Math.abs(A.get(i - 1) - k));
                        
                        
                    }
                }
            }
        }
        int ans = Integer.MAX_VALUE;
        for (int i = 0; i <= 100; i++) {
            ans = Math.min(ans, f[n][i]);
        }
        return ans;
    }

  

Minimum Adjustment Cost