初步接觸動態規劃,確確實實感受到了動態規劃的不死板而且靈活的尋找最優思路的精妙,簡單來說:動態規劃就是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。動態規劃的本質,是對問題狀態的定義和狀態轉移方程的定義。
前面剛剛接觸貪心演算法,在很多情況下,用貪心策略可以得到最優解,但是貪心的思想只是去尋找區域性最優解,即每次都是極端情況選擇。
貪心演算法
動態規劃
每一步都是當前的最優解,但是」鼠目寸光」,只能找到區域性最優解,每個階段的最優狀態都是由上乙個階段的最優狀態得到。
從整體上考慮,得到的結果是整體的最優解,每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到。
目前我已經做了好幾道dp的題目,找到對應狀態很重要。遞推思路也很重要。
動態規劃的指導思想:
在做每一步決策時,列出各種可能的區域性解。
依據某種判定條件,捨棄那些肯定不能得到最優解的區域性解。
以每一步都是最優的來保證全域性是最優的。
動態規劃問題的一般解題步驟:
1、判斷問題是否具有最優子結構性質,若不具備則不能用動態規劃。
2、把問題分成若干個子問題(分階段)。
3、建立狀態轉移方程(遞推公式)。
4、找出邊界條件。
5、將已知邊界值帶入方程。
6、遞推求解。
幾個基本概念
階段:據空間順序或時間順序對問題的求解劃分階段。
狀態:描述事物的性質,不同事物有不同的性質,因而用不同的狀態來刻畫。對問題的求解狀態的描述是分階段的。
決策:根據題意要求,對每個階段所做出的某種選擇性操作。
狀態轉移方程:用數學公式描述與階段相關的狀態間的演變規律
小明寫了乙個簡單的吃金幣遊戲,規則如下:
在乙個長方形地圖上,玩家每次能從乙個方格走到相鄰乙個方格。
玩家控制的角色可以向下或者向右走,但不能向上或向左走。每個方格上都有一定的金幣。
現在,小明想請你幫他想乙個策略,盡可能多的獲得金幣(從左上角走到右下角可能獲得的最大金幣數)。
如果用f[a][b]表示達到(a,b)這個點時所能吃到的最大金幣數量。
得到 遞推關係式:
f[a][b]=max(f[a-1][b],f[a][b-1])+coin[a][b]//狀態轉移方程
(此步即為遞迴定義最優解的值,列出狀態轉移方程)
f[m][n]即為所求。
int f[max][max],c;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
cout
acm週中學習總結
這週新開了搜尋演算法的學習,到目前為止,初步接觸了一些搜尋的題目和用法。繼續感悟 搜尋是一種利用列舉和遞迴尋找目標的演算法。核心是對路徑的列舉和遞迴操作 遞迴是搜尋的基礎 搜尋分為廣度優先搜尋 bfs 和深度優先搜尋 dfs 廣度優先搜尋就是逐層列舉,逐層查詢,這一層不列舉完不進行下一層。而深度優先...
acm週中學習總結
當下最重要的還是做好下一步計畫,平衡好時間。不管是usaco的題目還是別的oj上的題目,還是慢下來,思考明白。要把思考作為第一要義,思考清楚之後,寫 只是水到渠成的結果。演算法要及其熟,基本的板子要非常熟。本週圖論最短路徑演算法和最小生成樹演算法,以前只是聽過,現在學過才發現如此有趣,能夠解決很多問...
2019 10 9週中學習總結
感悟 把乙個知識搞明白,搞透徹,需要長期的思考,對問題思路的積累同樣需要長期的思考。所以,長期的思考相當重要!而對知識和 的熟練運用也需要長久的訓練。關於專業的課程,深入下來都是很精妙的,像是資料結構的課程,我以前對於stl裡的資料結構封裝掌握的雖然不是太好 因為常用的只有vector,map,se...