個人業餘愛好:以後會堅持每天至少一篇新隨筆,希望大家多多監督、支援和交流~
摘要:這是博主第一篇追隨演算法學習的心得體會,關於一道簡單的動態規劃題目,力求簡明扼要,聚焦交流學習~
正題:1.丟擲題目(對問題的初步理解):
* 眾所周知,牛妹有很多很多粉絲,粉絲送了很多很多禮物給牛妹,牛妹的禮物擺滿了地板。2.輸入輸出示例(舉一反三的理解題意,明確題目要實現的演算法初始引數和最終返回):* 地板是
* n×m的格仔,每個格仔有且只有乙個禮物,牛妹已知每個禮物的體積。
* 地板的座標是左上角(1,1) 右下角(n, m)。
* 牛妹只想要從屋子左上角走到右下角,每次走一步,每步只能向下走一步或者向右走一步或者向右下走一步
* 每次走過乙個格仔,拿起(並且必須拿上)這個格仔上的禮物。
* 牛妹想知道,她能走到最後拿起的所有禮物體積最小和是多少?
題目出處:
輸入:[[1,2,3],[2,3,4]]
輸出:7
說明:按路徑:(1,1)-> (1,2) -> (2,3) 走得到最小值。
3.分析:
一言可以概之,滿足最優化問題最關鍵的兩大必要條件:無後效性(未來決策與過去決策無關)和最優子策略(子問題可用同理的決策方法解決),是一道典型的動態規劃問題,而且是動規中最簡單的線性動規(通過線性結構解決足矣)。
4.例程:
/**5.總結:* 眾所周知,牛妹有很多很多粉絲,粉絲送了很多很多禮物給牛妹,牛妹的禮物擺滿了地板。
* 地板是
* n×m的格仔,每個格仔有且只有乙個禮物,牛妹已知每個禮物的體積。
* 地板的座標是左上角(1,1) 右下角(n, m)。
* 牛妹只想要從屋子左上角走到右下角,每次走一步,每步只能向下走一步或者向右走一步或者向右下走一步
* 每次走過乙個格仔,拿起(並且必須拿上)這個格仔上的禮物。
* 牛妹想知道,她能走到最後拿起的所有禮物體積最小和是多少?
* 問題判型:最優化問題
* 解決方案:動態規劃
* 逆向狀態轉換:如何走到右下方,首先前一步須要在右下方的周圍,推出走到格仔(n,m)的禮物體積最小和的狀態轉移方程:
* min[n][m] = min + a[n][m]
* 同時要檢查計算出來的方程是否有解,須要滿足的條件是:
* 1.有初始值(通常都可以顯然可見)
* 2.迭代收斂(確保有最終返回)
* 3.存在使迭代子均有符合定義的值(迭代子是指min[n - 1][m],min[n - 1][m - 1], min[n][m - 1]這些迭代元素,其值均要符合題意定義)的迭代順序
*/public class nowsistergiftsolution
if (presentvolumn.length == 0)
int min = new int[presentvolumn.length][presentvolumn[0].length];
for (int i = 0; i < presentvolumn.length; i++)
if (j > 0)
min[i][j] = m + presentvolumn[i][j];}}
return min[presentvolumn.length - 1][presentvolumn[0].length - 1];
}public static void main(string strings) ,};
int s = selectpresent(a);
system.out.println(s);
}}
無論解決什麼問題,實現是術,思路才是道;整道題下來,我的術在於實現的示例程式,而關鍵點在於建立狀態轉移方程的思路,逆向推導,理清正確迭代的決策如何通過計算實現,這才是此道題的道。另外,顯然,遞迴也是可行的實現,在此不再贅述。
一道遞迴 動規易錯題的總結
這兩天做leetcode發現自己對乙個遞迴 動規的問題容易想錯,特此來總結一下 總共3道題 乙個是前幾天碰見的面試題,給定乙個二叉樹還有乙個給定的數值,讓找到這課二叉樹是否有一條路徑上的值的和剛好等於給定的值 這裡的路徑只能從父節點到子節點 leetcode 1367 這道題是相當於上面的變體,給定...
一道演算法題,引發的思考
引言 有人問我這樣乙個問題,希望寫出 實現 有p0,p1兩點座標,組成乙個線段,求此線段與x點的的距離 我並不知道,如何完全的實現此功能,因為求點與線的公式,我記得是高中知識,但是我已經忘得差不多了,只是知道勾股定理算兩點間距離,直線方程有個斜率,如果給我時間去細想的話,應該可以理出頭緒,得到個寫此...
一道用遞規做的題目
題目 在乙個線性七個格位置的圖上有兩種不同顏色的棋子a,b。排列如下圖所示,中間的位置 為空。a a ab b b 要求將a,b的現行位置交換,形成下圖中的排列 b b ba a a 移動棋子的要求 每個格中只准放乙個棋子。任意乙個棋子均可移動一格放入空格內。任何的旗子不得跳躍兩個或兩個以上的旗子。...