題目:有代價的最短路徑
題目介紹:如下圖所示,現在平面上有N個點,此時N=7,每個點可能和其他點相連,相連的線有一定權值,求出從0點到N-1點的消耗權值的最小值。
分析:用動態規划的思路來解決,每一點與其他點的消耗權值的最小值都儲存在一個二維數組中,下一個點消耗的最小值可以根據前一個點來得出。如果兩個點不相連,可以認為這兩點的權值為無窮大。設一個二維數組初始化為無窮,再導入權值初始值,再用狀態方程得出最小值儲存在數組中。
狀態方程:l[k][j] = min(l[k][j], l[k][i] + l[i][j])
我們可以得出0到N-1的最短路徑表格:
距離 | 0 | 1 | 2 | 3 | 4 | 5 | 6 |
0 | 0 | 2 | 5 | 3 | 1 | 3 | 6 |
代碼:
1 #include <iostream> 2 using namespace std; 3 int min(int a, int b); 4 int main() 5 { 6 int X = 99999; 7 int N = 7; 8 int i, j, k; 9 int **l = new int *[N]; 10 for (i = 0; i<N; i++) 11 { 12 l[i] = new int[N]; 13 } 14 for (i = 0; i < N; i++) 15 { 16 for (j = 0; j < N; j++) 17 { 18 l[i][j] = X; 19 } 20 } 21 l[0][1] = l[1][0] = 2; 22 l[1][2] = l[2][1] = 3; 23 l[2][6] = l[6][2] = 4; 24 l[0][3] = l[3][0] = 3; 25 l[3][6] = l[6][3] = 3; 26 l[0][4] = l[4][0] = 1; 27 l[4][5] = l[5][4] = 2; 28 l[5][6] = l[6][5] = 3; 29 for (k = 0; k < N; k++) 30 { 31 for (j = 0; j < N; j++) 32 { 33 for (i = 0; i < N; i++) 34 { 35 l[k][j] = min(l[k][j], l[k][i] + l[i][j]); 36 } 37 } 38 } 39 for (i = 1; i < N; i++) 40 { 41 cout << l[0][i] << endl; 42 } 43 } 44 int min(int a, int b) 45 { 46 if (a > b) 47 { 48 return b; 49 } 50 else { return a; } 51 }
結果: