查找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的大小

  • 表格:= [[对于0到M范围内的i,为[0];对于0到n范围内的i,为[]

  • 对于0到M + 1范围内的j

    • table [0,j]:= | j-arr [0] |

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

    • 表[i,j]:= 100000000

    • 对于k(最大值(j-target和0)和最小值(M and j + target))中的k

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

    • 对于0到M + 1范围内的j

    • 回答:= 10000000

    • 对于0到M + 1范围内的j

      • 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
    猜你喜欢