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 here
Object []arr = A.toArray();
// write your code here
int 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;
}
}