給乙個整數陣列,調整每個數的大小,使得相鄰的兩個數的差不大於乙個給定的整數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...