给一个整数数组,调整每个数的大小,使得相邻的两个数的差小于一个给定的整数target,调整每个数的代价为调整前后的差的绝对值,求调整代价之和最小是多少。
样例
对于数组[1, 4, 2, 3]和target=1,最小的调整方案是调整为[2, 3, 2, 3],调整代价之和是2。返回2。
注意
你可以假设数组中每个整数都是正整数,且小于等于100。
class Solution {
public:
/**
* @param A: An integer array.
* @param target: An integer.
*/
int MinAdjustmentCost(vector<int> A, int target) {
// write your code here
int n = A.size();
if (n < 2)
{
return 0;
}
int buf[n][101];
for (int i = 1; i <= 100; i++)
{
buf[0][i] = abs(i-A[0]);
}
for (int i = 1; i < n; i++)
{
for (int j = 1; j <= 100; j++)
{
int left = max(j-target, 1);
int right = min(j+target, 100);
buf[i][j] = INT_MAX;
for (int k = left; k <= right; k++)
{
buf[i][j] = min(buf[i][j], buf[i-1][k]+abs(A[i]-j));
}
}
}
int result = INT_MAX;
for (int i = 1; i <= 100; i++)
{
result = min(result, buf[n-1][i]);
}
return result;
}
};