lintcode練習 91 最小調整代價

2021-08-27 16:09:09 字數 1517 閱讀 4924

給乙個整數陣列,調整每個數的大小,使得相鄰的兩個數的差不大於乙個給定的整數target,調整每個數的代價為調整前後的差的絕對值,求調整代價之和最小是多少。

對於陣列[1, 4, 2, 3]和target=1,最小的調整方案是調整為[2, 3, 2, 3],調整代價之和是2。返回2。

你可以假設陣列中每個整數都是正整數,且小於等於100

動態規劃的題。

陣列中的數值上限是upper_limit 是陣列中的最大值max(num) + target,即使數值怎麼調整,也只會在0-upper_limit間變動。

所以我們定義動態規劃陣列dp , shape(n+1, upper_limit+1),dp[i][j]表示調整到第i個數時,第i個數取值為j的最小代價和。

dp[0]沒有任何陣列,所以全部為0

動態規劃的方程為:

dp[i][j] = min(dp[i-1][left:right +1]) + abs(nums[i-1] - j)

abs(nums[i-1] - j) 表示第i個數調整到j自身的代價,min(dp[i-1][left:right +1]) + abs(nums[i-1] - j)是前乙個數累計的最小代價。

其中left是能夠調整到j的最小範圍,right是能夠調整到j的最大範圍。

class solution:

"""@param: a: an integer array

@param: target: an integer

@return: an integer

"""def minadjustmentcost(self, a, target):

n = len(a)

#最大的數值界限

upper_limit = max(a) + target

#定義二維陣列,shape=(n+1,upper_limit)數的個數,數值的範圍

dp = [[0] * (upper_limit + 1) for _ in range(n + 1)]

for i in range(1, n + 1):

for j in range(upper_limit + 1):

#left = 如果小於0就取0,否者取j - target; right = 如果大於upper_limit就取upper_limit,否則就取j+target

#left和right就是j能夠調整的數值範圍

left, right = max(0, j - target), min(upper_limit, j + target)

#dp[i][j]表示調整到第i個數時,第i個數取值為j的最小代價和

#abs(a[i-1] - j)是第i個數調整到j自身需要的代價

dp[i][j] = min(dp[i - 1][left:right + 1]) + abs(a[i - 1] - j)

return min(dp[n])

LintCode 91 最小調整代價(動態規劃)

題目 dp i j 表示調整到第i個數時,此時,第i個數取值為j,為代價和最小。顯然dp i 1 k 已知,則調整的總代價為dp i j dp i 1 k abs j a i 由於j和k有多種取值可能,所以迴圈求解判斷,k表示前乙個數,j表示現在的數,假設j確定,那麼k的取值就是在乙個範圍內,因為差...

lintcode91 最小調整代價 動態規劃

給乙個整數陣列,調整每個數的大小,使得相鄰的兩個數的差不大於乙個給定的整數target,調整每個數的代價為調整前後的差的絕對值,求調整代價之和最小是多少。樣例 樣例 1 輸入 1 4,2 3 target 1 輸出 2樣例 2 輸入 3 5,4 7 target 2 輸出 1 注意事項 你可以假設陣...

91 最小調整代價

2017.9.7 設定二維陣列 dp i j 表示 將第 i 個數調整到 j 時,當前最小的調整代價總和。那麼初始化時,將第0 個元素調整到 j 時,dp 0 j 就為 abs j arr 0 的值。在之後的運算中,將第 i 個元素調整到 j 時 其前乙個元素的變化範圍為 j targer j ta...