对于给定的正整数数组,我们替换数组中的每个元素,以使数组中相邻元素之间的差小于或等于给定的目标。现在,我们的任务是最小化调整成本,即新值和旧值之间的差之和。因此,我们基本上需要最小化Σ| A [i] –一个新的[i] | 其中0≤i≤n-1,n表示A []的大小,而new []表示相邻差小于或等于目标的数组。令数组的所有元素都小于常数M = 100。
arr = [56, 78, 53, 62, 40, 7, 26, 61, 50, 48], target = 20
输出结果
Minimum adjustment cost is 35
为了最小化调整成本Σ| A [i] –一个新的[i] |,对于数组中的所有索引i,我们都记得| A [i] –一个新的[i] |应该尽可能接近零。还应注意的是,
| A [i] –新的[i + 1]] | ≤目标。
在此,可以通过动态编程(DP)解决此问题。
假设dp1 [i] [j]表示将A [i]更改为j时的最小调整成本,则DP关系定义为–
dp1 [i] [j] = min {dp1 [i-1] [k]} + | j-A [i] |
对于所有k使得| k-j | ≤目标
在这种情况下,0≤i≤n和0≤j≤M,其中n是数组中的元素数,M =100。因此,以这种方式考虑所有k值,使得max(j – target,0)≤ k≤min(M,j + target)最后,对于所有0≤j≤M,数组的最小调整成本为min {dp1 [n – 1] [j]}。
// C++ program to find minimum adjustment cost of an array #include <bits/stdc++.h> using namespace std; #define M1 100 //显示函数以查找数组的最小调整成本 int minAdjustmentCost(int A1[], int n1, int target1){ //dp1 [i] [j]存储更改时的最小调整成本 //A1 [i]到j- int dp1[n1][M1 + 1]; //分别处理数组的第一个元素 for (int j = 0; j <= M1; j++) dp1[0][j] = abs(j - A1[0]); //对数组的其余元素执行 for (int i = 1; i < n1; i++){ // Now replaceA1 [i]到j- and calculate minimal adjustment //成本dp1 [i] [j] for (int j = 0; j <= M1; j++){ //我们将最小调整成本初始化为INT_MAX- dp1[i][j] = INT_MAX; // We consider all k such that k >= max(j - target1, 0) and // k <= min(M1, j + target1) and take minimum for (int k = max(j-target1,0); k <= min(M1,j+target1); k++) dp1[i][j] = min(dp1[i][j], dp1[i - 1][k] + abs(A1[i] -j)); } } //现在从dp表的最后一行返回最小值 int res1 = INT_MAX; for (int j = 0; j <= M1; j++) res1 = min(res1, dp1[n1 - 1][j]); return res1; } //测试上述功能的驱动程序 int main(){ int arr1[] = {56, 78, 53, 62, 40, 7, 26, 61, 50, 48}; int n1 = sizeof(arr1) / sizeof(arr1[0]); int target1 = 20; cout << "Minimum adjustment cost is " << minAdjustmentCost(arr1, n1, target1) << endl; return 0; }
输出结果
Minimum adjustment cost is 35