在 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

更新於:2020年8月25日

459 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.