動態規劃是運籌學的一個方向,就是把多級最優化問題分解成一系列的單階問題。在不斷增加的過程中,不斷的計算當前問題的最優解。
一般分為如下四個部分:
線性動規:攔截導彈,合唱隊形,挖地雷,建學校,劍客決斗等; 區域動規:石子合並, 加分二叉樹,統計單詞個數,炮兵布陣等; 樹形動規:貪吃的九頭龍,二分查找樹,聚會的歡樂,數字三角形等; 背包問題:01背包問題,完全背包問題,分組背包問題,二維背包,裝箱問題,擠牛奶(同濟ACM第1132題)等;這個問題是《算法導論》的動態規劃的例題,我自己覺得這道題比較簡單而且典型,所以就解釋下這個題目:
Colonel汽車公司在有兩條裝配線的工廠裡生成汽車。每一條裝配線上有n個裝配站,
兩條生產線上相同位置的裝配站功能相同,但所需時間不同,並且汽車底盤在兩條
裝配線間轉移要花費一定的時間。如下圖所示兩條生產線。
vc+88rWltcTKx6OsztLDx9a709DBvdbWx+m/9qOs0rvW1srH1NrXsMXkz98xyc/KsbzktsyjrNK71tbKx9Ta17DF5M/fMsnPyrG85LbMoaM8L3A+DQo8cD682cjnsanBpsvRy/ejrMyw0MTIpcvjtcO7sKOo0rK+zcrHtd256bXEsOy3qKOpoaPKsbzkuLTU077NyscyXm6jrNXiuPbKx7K7v8m908rctcShozwvcD4NCjxwPtXiuPbKsbryztLDx7XEsOy3qMrHz8i007Xa0ru49s7KzOK/qsq8o6zXsMXkz98xLCAyyc/Wu9PQ0ru49nN0YXRpb26ho8THw7SxyL3PvPK1paOs0ruxyL3Pvs26w8HLoaO1sdPQwb249nN0YXRpb261xMqxuvKjrL7Nyse008nP0ru0zrHIvc+1xL3hufvW0CjSu7j2bGluZSAx1+62zKOs0ru49mxpbmUgMtfutswp1tC8zND4vNPJz7Wxx7BzdGF0aW9utcTWtbzM0PixyL3PoaM8L3A+DQo8cD7L+dLUztLDx7eiz9bKx8O/uPa1scewtcTX7tPFveKjrLa8sPy6rMHLyc/Su7TOtcTX7tPFveKhozwvcD4NCjxoMSBpZD0="代碼">代碼代碼就是我們從最開始,一直保存當前問題的最優解,然後去求的下一次的最優解。
// // main.cpp // DP_line // // Created by Alps on 15/4/26. // Copyright (c) 2015年 chen. All rights reserved. // #include
using namespace std; #define NUM 5 int main(){ int first[NUM];//到裝備站1,i的最短路徑長度 int second[NUM];//到裝配站2,i的最短路徑長度 int linef[NUM]; //從1進入的路徑 int lines[NUM]; //從2進入的路徑 int a[NUM]; //在裝配站1,i 所需要呆的時間 int b[NUM]; //再裝配站2,i 所需要呆的時間 int m[NUM]; //從裝配站1,i-1 到裝配站2,i的時間 int n[NUM]; //從裝配站2,i-1 到裝配站1,i的時間 int line[NUM]; //當前最短路經所經過的裝配站 int f[NUM]; //當前最短路徑長度 int ea,eb,xa,xb; // ea為進入裝配站1時間,eb為進入2的時間,xa為出裝配站1的時間,xb為出裝配站2的 scanf(%d %d %d %d,&ea,&eb,&xa,&xb); for(int i=0;i
這個代碼比較簡單,精華就是那個for循環了。
測試用例如下:
3 2 3 4 4 3 3 6 6 3 2 3 5 2 2 3 2 4 3 4 4 3
假如有任何建議,歡迎評論。互相學習。謝謝。