在 Python 中查找数组的最小调整成本
假设我们有一个正数数组;我们替换数组中的每个元素,使得数组中两个相邻元素之间的差小于或等于给定的目标值。现在,我们必须最小化调整成本,即新值和旧值之间差异的总和。更准确地说,我们将最小化 ∑|A[i] – Anew[i]|,其中 i 的范围是 0 到 n-1,n 表示 A 的大小,Anew 是相邻差小于或等于目标值的数组。
因此,如果输入类似于 [56, 78, 53, 62, 40, 7, 26, 61, 50, 48],目标值为 20,则输出将为 25
为了解决这个问题,我们将遵循以下步骤:
n := arr 的大小
table := [[0 for i in range 0 to M + 1] for i in range 0 to n]
for j in range 0 to M + 1, do
table[0, j] := |j - arr[0] |
for i in range 1 to n, do
for j in range 0 to M + 1, do
table[i, j] := 100000000
for k in range maximum of (j-target and 0) and minimum of (M and j + target), do
table[i,j] = minimum of table[i,j], table[i - 1,k] + |arr[i] - j|
ans := 10000000
for j in range 0 to M + 1, do
ans = minimum of ans and table[n-1, j]
return ans
示例
让我们看下面的实现,以便更好地理解:
M = 100 def get_min_cost(arr, target): n = len(arr) table = [[0 for i in range(M + 1)] for i in range(n)] for j in range(M + 1): table[0][j] = abs(j - arr[0]) for i in range(1, n): for j in range(M + 1): table[i][j] = 100000000 for k in range(max(j - target, 0), min(M, j + target) + 1): table[i][j] = min(table[i][j], table[i - 1][k] + abs(arr[i] - j)) ans = 10000000 for j in range(M + 1): ans = min(ans, table[n - 1][j]) return ans arr= [56, 78, 53, 62, 40, 7, 26, 61, 50, 48] target = 20 print(get_min_cost(arr, target))
输入
[56, 78, 53, 62, 40, 7, 26, 61, 50, 48], 20
输出
35
广告