動態規劃--最小調整代價
91. Minimum Adjustment Cost
【題目】Given an integer array, adjust each integers so that the difference of every adjacent integers are not greater than a given number target.
If the array before adjustment is A, the array after adjustment is B, you should minimize the sum of |A[i]-B[i]|
給一個整數陣列,調整每個數的大小,使得相鄰的兩個數的差小於一個給定的整數target,調整每個數的代價為調整前後的差的絕對值,求調整代價之和最小是多少。
你可以假設陣列中每個整數都是正整數,且小於等於100。你可以假設陣列中每個整數都是正整數,且小於等於100。
【例子】
對於陣列[1, 4, 2, 3]和target=1,最小的調整方案之一是調整為[2, 3, 2, 3],調整代價之和是2。返回2。【思路】
因為數的範圍是1~100,每個數有100中調整的可能性,採用動態規劃的思路。
建立大小為(n+1)*101的二維陣列rec記錄所有可能調整的代價,第一行初始化為全0,其他行為最大值。
rec中第i行對應A[i-1]。對於每個數A[i],調整後的結果有100種,用rec[i][j]表示數字A[i]調整為j的最小代價。對於每個rec[i][j],A[i-1]調整到k的代價加上A[i]調整到j的最小代價即為rec[i][j]的代價。而k又有100種選擇,對於j,當|j-k|的絕對值不大於target時,代價最小,當前rec[i][j]為rec[i-1][k]
+( j - A[i-1]),rec[i][j]保留所有可能代價中的最小代價。
最後,rec[n][0~100]中的最小代價即為對整個陣列調整後的最下代價。
為什麼不能使用一維陣列記錄最小代價並更新?class Solution { public: /** * @param A: An integer array. * @param target: An integer. */ int MinAdjustmentCost(vector<int> A, int target) { // write your code here int n = A.size(); vector<vector<int> > rec(n+1, vector<int> (101, numeric_limits<int>::max())); //初始化第一行為0 //rec[i][j]表示第i個數調整到j的最小代價,k表示相鄰兩個數調整到某個值的所有可能 rec[0] = vector<int>(101, 0); for (int i = 1; i <= n; ++i) { for (int j = 0; j <= 100; ++j) { for (int k = 0; k <= 100; k++) { //如果k在target範圍內,更新rec[i][j]的值為上一個數到k的代價,加上當前數到j的代價 if (abs(j-k) <= target) rec[i][j] = min(rec[i-1][k] + abs(A[i-1]-j), rec[i][j]); } } } int cost = numeric_limits<int>::max(); for (int i = 0; i <= 100; ++i) { cost = min(cost, rec[n][i]); } return cost; } };
因為與揹包問題不同,揹包問題中的每個物品可以只根據前面的物品放置狀況調整,可以用一維陣列記錄上一個物品調整後的狀態,對於當前物品從後往前進行操作,保證使用的都是上一個物品調整後的狀態。但本題中,每個位置的數與它前後相鄰的數都有關,使用一維陣列只能保證左邊為之前的狀態,右邊為當前物品的狀態,無法用右邊的數進行更新。
相關推薦
動態規劃--最小調整代價
91. Minimum Adjustment Cost 【題目】 Given an integer array, adjust each integers so that the difference of every adjacent integers are n
lintcode最小調整代價
題目: 給一個整數陣列,調整每個數的大小,使得相鄰的兩個數的差不大於一個給定的整數target,調整每個數的代價為調整前後的差的絕對值,求調整代價之和最小是多少。 假設陣列中每個整數都是正整數,且小於等於100。 樣例: 對於陣列[1, 4, 2, 3]和target=1,最小的調整方案
動態規劃-最小路徑和
給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1], [1,5,1], [4,2,1] ] 輸出: 7 解釋:
動態規劃 最小路徑和
給定一個只含非負整數的m*n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。只能向下走或者向右走class Solution: """ @param grid: a list of lists of integers @return: An inte
算法56-----最小編輯代價【動態規劃】
狀態 tro 如果 for 字符串 技術 gin 給定 clas 一、題目:最小編輯代價 給定兩個字符串str1和str2,再給定三個整數ic,dc,rc,分別代表插入、刪除、替換一個字符的代價,返回將str1編輯成str2的最小代價。舉例:str1="abc" str
演算法56-----最小編輯代價【動態規劃】
一、題目:最小編輯代價 給定兩個字串str1和str2,再給定三個整數ic,dc,rc,分別代表插入、刪除、替換一個字元的代價,返回將str1編輯成str2的最小代價。舉例:str1="abc" str2="adc" ic=5 dc=3
動態規劃C++實現--最小編輯代價
題目:給定兩個字串 str1 和 str2,再給定三個整數 ic, dc 和 rc,分別代表插入、刪除和替換1個字元的代價, 返回 str1 編輯成 str2 的代價。舉例: str1 = "abc", str2 = "adc", ic = 5
動態規劃 最長公共子序列
一個 then mda 偽代碼 n-2 msu csdn static 證明 最長公共子序列(LCS)問題 下面通過一個具體的例子來學習動態規劃方法 —— 最長公共子序列問題。 最長公共子串(Longest Common Substring)與最
動態規劃 ------最大子段和
動態規劃 函數 cnblogs png 規劃 font 3-9 .cn -- 1.最大子段和的問題描述 2.動態規劃的求解: 3.優化函數的遞推方程 4.動態規劃求解偽碼 5.動態規劃求解的小結: 動態規劃的
動態規劃-最長公共子序列LCS
return str2 pat for 思路 規劃 得來 表示 || 0 問題 給定兩個字符串,求最長公共子序列LCS。 也就是說兩個字符串中都有的部分,或者理解為,兩個字符串同時都刪除字符串中的某些字符,使得最終的兩個字符串,相等,且是最長的。 1 分析 假設兩個str1
最小編輯代價-golang
true 給定 src != 大小 n+1 lan 石頭 表示 題目: 給定兩個字符串str1和str2,在給定三個整數ic,dc和rc,分別代表插入、刪除和替換一個 字符,返回將str1編輯成str2的最小代價。 解題方法: 動態規劃。首先生成大小為(M+1)X(N+1)
《算法導論》動態規劃—最優二分搜索樹
out 頻率 平衡 單詞 規劃 重疊 復雜 let 概率 案例 ?假如我們現在在設計一個英文翻譯程序,要把英文翻譯成漢語,顯然我們需要知道每個單詞對應的漢語意思。我們可以建立一顆二分搜索樹來實現英語到漢語的關聯。為了更快速地翻譯,我們可以使用AVL樹或者紅黑樹使每次查詢的時
bzoj 3232 圈地遊戲 —— 01分數規劃+最小割建圖(最大權閉合子圖)
++ tar 答案 題目 zoj ems eps string sid 題目:https://www.lydsy.com/JudgeOnline/problem.php?id=3232 心煩意亂的時候調這道題真是...越調越氣,就這樣過了一晚上... 今天再認真看看,找出幾
動態規劃-最長公共子序列
https://www.cnblogs.com/hapjin/p/5572483.html 一,問題描述 給定兩個字串,求解這兩個字串的最長公共子序列(Longest Common Sequence)。比如字串1:BDCABA;字串2:ABCBDAB 則這兩個字串的最長公共子序列長度為4
動態規劃-最長上升子序列(LIS)
時間複雜度為〇(nlogn)的演算法,下面就來看看。 我們再舉一個例子:有以下序列A[]=3 1 2 6 4 5 10 7,求LIS長度。 我們定義一個B[i]來儲存可能的排序序列,len為LIS長度。我們依次把A[i]有序地放進B[i]裡。(為了方便,i的範圍就從1~n表示第i個數) A[1]=3,把
[Bzoj3232]圈地遊戲(分數規劃+最小割/spfa判負環)
Description DZY家的後院有一塊地,由N行M列的方格組成,格子內種的菜有一定的價值,並且每一條單位長度的格線有一定的費用。 DZY喜歡在地裡散步。他總是從任意一個格點出發,沿著格線行走直到回到出發點,且在行走途中不允許與已走過的路線有任何相交或觸碰(出發點除外)。記這條
動態規劃-最長公共子序列問題(LCS)
若給定序列X={x1,x2,…,xm},則另一序列Z={z1,z2,…,zk} 是X的子序列 是指存在一個嚴格遞增下標序列{i1,i2,…,ik}使得對於所有j=1,2,…,k有:zj=xij。 例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相應的遞增下標
動態規劃-最長上升子序列問題(LIS)
給定n個整數A1,A2,...An,按從左到右的順序選出儘量多的整數,組成一個上升子序列(子序列可以理為:刪除0個或多個數,其他數的順序不變)。例如序列1,6,2,3,7,5,可以選出上升子序列1,2,3,5,也可以選出1,6,7,但前者更長。選出的上升子序列中相鄰元素不能相等。 輸入:整數
動態規劃——最大連續子序列和
最大連續子序列和問題如下: 下面介紹動態規劃的做法,複雜度為 O(n)。 步驟 1:令狀態 dp[i] 表示以 A[i] 作為末尾的連續序列的最大和(這裡是說 A[i] 必須作為連續序列的末尾)。 步驟
動態規劃——最長子序列
動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。 為了節約重複求相同子問題的時間,引入一個表(陣列)記錄所有已解決的子問題的答案,不管它們是否對最終