矩陣求最短路徑
題目:
給定一個M×N的矩陣,定義一條路徑為:從矩陣左上頂點數字出發到達右下數字,每一次只可以從一個數字出發向右移動一步或向下移動一步,定義路徑和為:路徑經過的數字的和。要求編寫一個程式,找到路徑和最小的那條路徑,並給出最小路徑和。
給定如圖所示矩陣:一條路徑為2->0->3->6->9->5,路徑和為25
[2 ,0 ,11,1 ]
[4 ,3 ,6 ,12]
[7 ,10,9 ,5 ]
要求:測試時輸入一個矩陣(輸入方式隨意),然後程式輸出該矩陣的最小路徑和與路徑。
思路:動態規劃求解。dp[i][j]表示從點D[0][0]到點D[i][j]的最短路徑和。
對於點D[i][j]它只能從點D[i-1][j]或者點D[i][j-1]而來,所以有遞推公式dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + D[i][j]; 特殊的,對於第一行的點D[0][j]只可能由點D[0][j-1]而來;對於第一列的點D[i][0]只可能由點D[i-1][0]而來。
程式碼解答:
#include<iostream>
using namespace std;
const int maxn = 1001; //行列最大值
int M,N,K=0; //M行N列,路徑有K個結點
int D[maxn][maxn]; //儲存原始矩陣值
int dp[maxn][maxn]; //從D[0][0]到D[i][j]路徑最小值
int mp[maxn]; //儲存路徑中的結點值
int main(){
cin >> M >> N;
for(int i=0; i<M; i++)
for(int j=0; j<N; j++)
cin >> D[i][j];
dp[0][0]=D[0][0];
for(int i=1; i<M; i++)
dp[i][0] = dp[i-1][0]+ D[i][0]; //對於第一列的點D[i][0],只可能是從上面的點D[i-1][0]往下走
for(int j=1; j<N; j++)
dp[0][j] = dp[0][j-1]+ D[0][j]; //對於第一行的點D[0][j],只可能是從左邊的點D[0][j-1]往右走
for(int i=1; i<M; i++)
for(int j=1; j<N; j++) //點D[i][j],是從D[i][j-1]和D[i-1][j]較小的而來
dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + D[i][j];
int i=M-1,j=N-1;
mp[K++]=D[i][j];
while(i>=0 && j>=0){ //倒著找路徑上的點
if(i==0 && j==0){
break;
} else if(i==0){ //在第一行上,那麼上一個點只能是左邊的點
mp[K++]=D[i][j-1];
j--;
} else if(j==0){ //在第一列上,那麼上一個點只能是上面的點
mp[K++]=D[i-1][j];
i--;
} else { //否則就找左邊和上面的dp最小對應的那個點D
if(dp[i-1][j]<dp[i][j-1]){
mp[K++]=D[i-1][j];
i--;
} else {
mp[K++]=D[i][j-1];
j--;
}
}
}
for(int i=K-1;i>=0;i--){
cout<<mp[i];
if(i!=0) cout<<"->";
}
cout << endl << dp[M-1][N-1] <<endl;
return 0;
}
//測試
結果如下圖:
相關文章
- BFS求無權圖的單源最短路徑-鄰接矩陣儲存矩陣
- 最短路:求最長最短路
- 矩陣快速冪加速最短路矩陣
- 求任意矩陣的伴隨矩陣矩陣
- 矩陣求導矩陣求導
- 矩陣求逆矩陣
- 機器學習中的矩陣向量求導(五) 矩陣對矩陣的求導機器學習矩陣求導
- 矩陣中的路徑矩陣
- 矩陣求導(二)矩陣求導
- 矩陣求導(一)矩陣求導
- L2-001 緊急救援 (25分)【新增陣列求最短路數量】【pre陣列記錄最短路徑】陣列
- 矩陣求導公式【轉】矩陣求導公式
- 【矩陣求導】關於點乘 (哈達瑪積)的矩陣求導矩陣求導點乘
- 求最短路徑——DFS+Floyd演算法演算法
- JZ-065-矩陣中的路徑矩陣
- 機器學習中的矩陣向量求導(四) 矩陣向量求導鏈式法則機器學習矩陣求導
- 求最短路徑-----迪傑斯特拉演算法演算法
- 向量和矩陣求導公式總結矩陣求導公式
- 6.4.2最短路徑
- 圖 - 最短路徑
- 單源最短路徑:最短路徑性質的證明
- HDU - 3790 (雙標準限制最短路徑)最短路徑問題
- 最短路徑問題
- 單源最短路徑
- 最短路 || 最長路 || 次短路
- 巨大的矩陣(矩陣加速)矩陣
- 鄰接矩陣、度矩陣矩陣
- 劍指offer:JZ12 矩陣中的路徑矩陣
- numpy.linalg包函式用法集錦(求逆矩陣,求矩陣行列式的值,求特徵值和特徵向量,解方程組)函式矩陣特徵
- 奇異矩陣,非奇異矩陣,偽逆矩陣矩陣
- PTA 7-9 求矩陣每行元素的和矩陣
- 劍指 Offer 12-矩陣中的路徑c++矩陣C++
- 力扣 - 劍指 Offer 12. 矩陣中的路徑力扣矩陣
- 最短路徑演算法演算法
- 最短路徑(dijkstra 與 Floyd)
- QOJ #8673. 最短路徑
- 迷宮的最短路徑
- 資料結構:陣列,稀疏矩陣,矩陣的壓縮。應用:矩陣的轉置,矩陣相乘資料結構陣列矩陣