Making the Grade (POJ 3666)

At first, when we add height or remove height at a point, we should always make it to a existing height in current grade. There is no need to doing more or less. Based on this we can give a DP solution.

Let's say the original array is , at first we sort the current heights into an array . Let be that the minimum cost with the first items in and we make the slope ends in a height of . Then we have our DP formular:

We can same the minimum during iteration to reduce running time. With this solution we need not care if the slope is going up or down.

import java.io.*;
import java.util.*;

public class MakingTheGrade {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        int[] elev = new int[N];
        int[] elevsort = new int[N];
        for (int i = 0; i < N; i++) {
            elev[i] = in.nextInt();
            elevsort[i] = elev[i];
        }
        Arrays.sort(elevsort);

        int[] dp = new int[N];
        int[] min = new int[N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                dp[j] = min[j] + Math.abs(elev[i] - elevsort[j]);
            }
            min[0] = dp[0];
            for (int j = 1; j < N; j++) {
                min[j] = Math.min(min[j - 1], dp[j]);
            }
        }

        int res = Integer.MAX_VALUE;
        for (int n : min) {
            res = Math.min(res, n);
        }

        System.out.println(res);
    }
}