動態規劃入門(四)DP 基本思想與實現

2021-06-26 10:32:56 字數 2504 閱讀 6965

poj1160, post office。動態規劃的經典題目。呃,又是經典題目,dp部分的經典題目怎就這麼多。木有辦法,事實就這樣。

求:在村莊內建郵局,要使村莊到郵局的距離和最小。

設有m個村莊,分別為 v1 v2 v3 … vm, 要建n個郵局,分別為p1 p2 p3 … pn。

在dp的問題中,經常有從m個物體中選n個物體的情況,本題顯然也屬於這種情況。一般可以這樣考慮:假設已經選了1個,那麼就成了在m-1個中選n-1個的問題了。

對於此題,也可以考慮先建乙個郵局。建在**呢?不妨設,該郵局建在vk+1..vm之間的某個村莊裡,而且規定vk+1..vm之間再不允許建立其他郵局了。因此,剩下的n-1個郵局必然出現在v1..vk之間的村莊內,這樣問題就轉換成:在前k個村莊裡選n-1個郵局的問題。

設dp( m,n )表示在v1…vm之間建立n個郵局時的最短距離。

l( i, j )表示在vi…vj之間建立乙個郵局的最短距離。

狀態轉換方程:

dp( m,n ) = min( dp( k,n-1 ) + l( k+1,m ) ),    其中:1 <= k程式設計實現:沒啥說的,具體看**。

心得;dp的基本思想與分治法的基本思想是類似的;分析如下

1.都是組合子問題的解來求解求解原問題

2.分治法將問題劃分為互不相交的子問題,遞迴地求解子問題,再將它們的解組合起來,求出原問題的解。

3.動態規劃應用與子問題重疊的情況,即不同的子問題具有公共的子子問題。

4.動態規劃的實現方法是自底向上法,將子問題按規模排序,按由從小到大的順序進行求解,當求解某個子問題時,它所依賴的更小的子問題已經求解完畢,結果已儲存,每個子問題只需求解一次。

程式設計實現注意事項:

//dp陣列必須進行初始化

for(int i=1;i<=vnum;i++)

dp[i][0]=inf;

dp陣列必須進行初始化,否則得不到正確結果

#includeusing namespace std;

//***************************常量定義***************************

const int v_max=300;

const int p_max=30;

const int inf=999999;

//**************************題目變數****************************

//全域性變數全部初始化為0

int vnum;//村莊數

int pnum;//郵局數

int vpos[v_max];//村莊座標

//*************************演算法變數*****************************

int d[v_max][v_max];//d[i][j]表示第i個村莊與第j個村莊之間建乙個郵局的最短距離

int dp[v_max][p_max];//dp[m][n]表示前m個村莊裡面建n個郵局的最短距離

void solve()

//dp陣列必須進行初始化

for(int i=1;i<=vnum;i++)

dp[i][0]=inf;

改進程式使之能輸出選擇的郵件序列,其思想與poj1458的思想類似,因為dp[m][n]的值取決於dp[k][n-1] (n-1=using namespace std;

//***************************常量定義***************************

const int v_max=300;

const int p_max=30;

const int inf=999999;

//**************************題目變數****************************

//全域性變數全部初始化為0

int vnum;//村莊數

int pnum;//郵局數

int vpos[v_max];//村莊座標

//*************************演算法變數*****************************

int d[v_max][v_max];//d[i][j]表示第i個村莊與第j個村莊之間建乙個郵局的最短距離

int dp[v_max][p_max];//dp[m][n]表示前m個村莊裡面建n個郵局的最短距離

int flag[v_max][p_max];//flag[m][n]儲存計算dp[m][n]時所選擇的dp[k][n-1]的k

void solve()

動態規劃入門(一) DP 基本思想

動態規劃 dp 是一種重要的演算法設計思想,是演算法設計的一柄利器。但是,要掌握dp並且運用自如,絕對不是什麼容易的事。dp的基本思想 1.把乙個大問題的解轉化為若干個小問題的解。2.如果得到了這些小問題的解,然後再經過一定的處理,就可以得到原問題的解。3.這些小問題與原問題有著結構相同,即小問題還...

動態規劃基本思想

動態規劃與貪心策略類似,將乙個問題的解決方案視為一系列決策的結果。不同的是,貪心演算法每採用一次貪心選擇便做出乙個不可撤回的決策,而在動態規劃中,還要考察每個最優決策序列中是否包含乙個最優決策自序列。使用動態規劃時,所求問題應具有以下兩種性質。1.最優子結構性質 所求問題的最優子結構性質是採用動態規...

動態規劃入門(dp)

dp的基本思想,是把大問題轉化成乙個個小問題,然後遞迴解決。所以本質思想的話還是遞迴。dp最重要的是要找到狀態轉移方程,也就是把大問題化解的過程。舉個例子 乙個數字金字塔 112 2332 2243 133 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一...