1. 程式人生 > >動態規劃--最小調整代價

動態規劃--最小調整代價

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] 必須作為連續序列的末尾)。   步驟

動態規劃——長子序列

動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。 為了節約重複求相同子問題的時間,引入一個表(陣列)記錄所有已解決的子問題的答案,不管它們是否對最終