91. 最小调整代价
给一个整数数组,调整每个数的大小,使得相邻的两个数的差不大于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
样例
样例 1:
输入: [1,4,2,3], target=1
输出: 2
样例 2:
输入: [3,5,4,7], target=2
输出: 1
注意事项
你可以假设数组中每个整数都是
正整数
,且小于等于
100
。
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
int[][] dp = new int[A.size()][101];
for (int i = 1; i <= 100; i++) {
dp[0][i] = Math.abs(A.get(0) - i);
}
int end = A.size() - 1;
for (int i = 1; i <= end; i++) {
for (int j = 1; j <= 100; j++) {
int min = Integer.MAX_VALUE;
int max = Math.min(j + target, 100);
for (int k = Math.max(j - target, 1); k <= max; k++) {
min = Math.min(dp[i - 1][k], min);
}
dp[i][j] = min + Math.max(Math.abs(A.get(i) - j), 0);
}
}
int min = Integer.MAX_VALUE;
for (int j = 1; j <= 100; j++) {
min = Math.min(dp[end][j], min);
}
return min;
}
}