一、設計最短路徑的動態規劃演算法
《演算法導論》中一般將設計動態規劃演算法歸納為下面幾個步驟:
1)分析最優解的結構
2)遞迴定義最優解的值
3)自底向上計算最優解的值
4)從計算的最優解的值上面構建出最優解
二、最短路徑的結構
從最優解的結構開始分析(我們假設沒有權值為負的路徑),對於圖g的所有結點對最短路徑的問題,我們能知道一條最短路徑的子路徑都是最短路徑。假設用鄰接矩陣w=w(ij)來表示輸入帶權圖,考慮從結點i到結點j的一條最短路徑p,如果p最多有m(m為有限值)條邊。若i=j,則p的權值為0而且不包含其他邊。若i ≠ j,可以將i到j的路徑轉換為i -> k、k->j。
三、乙個給定的圖
1)給定乙個有向圖
2)我們可以給出這個有向圖的鄰接矩陣
四、c++實現
1 #include 2 #include3 #include4 #include5 #include上述**是將給定的鄰接矩陣從檔案中讀取6using
namespace
std;
7const
int max_num = 100;8
9 typedef struct
point point;
1718 vectorpoints;
19 vectorres;
20 vectornum;
2122
void
file_read();
23void
createpoint();
24void
optimalbst();
25void
printroot(point p);
26void printoptimalbst(int i, int j, int r, point p, ofstream &filewrite);
27 template
28 type stringtonum(const
string&str)
3536
void
file_read()
44else
49 str1 = "";50
}51}52
res.push_back(str1);
53fileread.close();54}
55}5657
void
createpoint()
67 p.n =n;
68for(int k = 0; k<=n; k++) p.p[k] = stringtonum(temp_str[k]);
69for(int k = n + 1; k1)] = stringtonum(temp_str[k]);
70points.push_back(p);71}
72}7374
//根據書上的偽**:接收概率列表p1....pn和q0.....qn以及規模n作為輸入 計算出e和root
75void
optimalbst()
85 p.n =n;
8687
for(int k = 0; k<=n; k++) p.p[k] = stringtonum(temp_str[k]);
88for(int k = n + 1; k1)] = stringtonum(temp_str[k]);
8990
//初始化只包括虛擬鍵的子樹
91for (int i = 1;i <= p.n + 1;++i)
95//
由下到上,由左到右逐步計算
96for (int len = 1;len <= p.n;++len)
110}
111}
112}
113points.push_back(p);
114}
115}
116117
void printoptimalbst(int i, int j, int r, point p, ofstream &filewrite)
126127
if (j < i - 1
)else
if (j == i - 1)
136else
142 printoptimalbst(i, root_node - 1
, root_node, p, filewrite);
143 printoptimalbst(root_node + 1
, j, root_node, p, filewrite);
144}
145146
//輸出最優二叉查詢樹所有子樹的根
147void
printroot(point p)
153 cout <
154}
155 cout <
156}
157158
intmain()
168filewrite.clear();
169return0;
170 }
然後根據輸入的鄰接矩陣求出最短路徑
風沙迷了眼 閱讀(
...)
編輯收藏
動態規劃最短路徑問題
最短路徑問題 下圖給出了一張地圖,地圖中每個頂點代表乙個城市,兩個城市間的連線代表道路,連線上的數值代表道路長度,求從a地到e地的最短路徑。分析 本題可以利用深度搜尋法求解,偽 如下 vars 未訪問的城市集合 dist i,j 儲存任意兩個城市間的距離陣列 function search city...
c 實現 動態規劃之最短路徑和問題
題目描述 給定乙個由非負整數填充的m x n的二維陣列,現在要從二維陣列的左上角走到右下角,請找出路徑上的所有數字之和最小的路徑。注意 你每次只能向下或向右移動。輸入 1,2 5,6 1,1 輸出 8方法 二維dp,初始化第一行和第一列,在此基礎上去求解 class solution for int...
動態規劃 最短路徑跳箱子問題
求從第乙個箱子跳到最後乙個箱子最短需要多少步 輸入乙個陣列 如 1,3,0,1,5 表示第乙個箱子能最多往右跳1步 第二個最多往右跳3步 若不能跳到最後乙個箱子輸出 1 若開始就在最後乙個箱子輸出0 假設輸入的陣列 為長度為n的 nums n 如 1,3,0,1,5 首先設定乙個陣列every pa...