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 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一...