91

来源:互联网 发布:淘宝客服(在家上班) 编辑:程序博客网 时间:2024/04/27 15:22

2017.9.7

设定二维数组 dp[i][j],表示 将第 i 个数调整到 j 时,当前最小的调整代价总和。

那么初始化时,将第0 个元素调整到 j 时,dp[ 0 ][ j ] 就为 abs(j - arr[0])的值。

在之后的运算中,将第 i 个元素调整到 j 时 ,其前一个元素的变化范围为 【j - targer ,j + target】。

此时的dp[ i ][ j ] 应该为 arr[i] 调整到 j 的代价,加上 arr[i-1] 调整到【j - targer ,j + target】的最小值。

public class Solution {    /*     * @param A: An integer array     * @param target: An integer     * @return: An integer     */    public int MinAdjustmentCost(List<Integer> A, int target) {        // write your code hereObject []arr = A.toArray();        // write your code hereint count = Integer.MAX_VALUE;int length = arr.length;if(length <= 1){return count;}int [][]dp = new int[length][101];for(int j = 0; j < 101; j ++){dp[0][j] = Math.abs((int)arr[0] - j); }for(int i = 1; i < length; i++){for(int j = 0; j < 101; j++){int tmp = Integer.MAX_VALUE;for(int k = charge(j-target); k <= charge(j+target);k++){if(dp[i-1][k] < tmp){tmp = dp[i-1][k];}}dp[i][j] = Math.abs((int)arr[i] - j) + tmp;}}for(int j = 0; j < 101; j ++){if(dp[length -1 ][j] < count){count = dp[length -1 ][j];}}return count;    }    public int charge(int x) {if( x < 0){return 0;}if( x > 100){return 100;}return x;}}