在 Python 中查找数组的最小调整成本

pythonserver side programmingprogramming更新于 2025/10/10 19:24:17

假设我们有一个正数数组;我们替换该数组中的每个元素,以便数组中两个相邻元素之间的差异小于或等于给定目标。现在,我们必须最小化调整成本,即新值和旧值之间的差异总和。更准确地说,我们最小化 ∑|A[i] – Anew[i]|其中 i 在 0 到 n-1 的范围内,这里 n 表示 A 的大小,Anew 是相邻差值小于或等于目标的数组。

因此,如果输入为 [56, 78, 53, 62, 40, 7, 26, 61, 50, 48],target = 20,则输出为 25

为了解决这个问题,我们将遵循以下步骤 −

  • n := 数组的大小

  • 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]|

  • 对于范围在 1 到 n 内的 i,执行

    • 对于范围在 0 到 M + 1 内的 j,执行

      • table[i, j] := 100000000

      • 对于范围在 (j-target 和 0) 中的最大值和 (M 和 j + target) 中的最小值的 k,执行

        • table[i,j] = table[i,j] 的最小值,table[i - 1,k] + |arr[i] - j|

  • ans := 10000000

  • 对于 j 在 0 到 M + 1 范围内,执行

    • ans = ans 和 table[n-1, j] 的最小值

    • 返回 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

相关文章


有用资源