目錄
問題:
給定一個二維數組map[4][4] ={{1,3,5,9},{8,1,3,4},{5,0,6,1},{8,8,4,0}}。求從左上角到右下角的最短路徑和。即從左上到右下二維數組中元素之和最小的組合。
應用場景:
導航地圖中從規劃起點位置到終點位置的最短路程。
分析:
該問題爲一個經典的動態規劃問題,所以先分析它的計算過程。
可以初始一個和二維數組map一樣大小的dp。dp[i][j]表示當前狀態的最短路徑和。
map[i][j] if i=0, j=0
dp[i][j] = map[i][j] + dp[i][j-1] if i=0; j = [1,m)
map[i][j] + dp[i-1][j] if j=0; i = [1,n)
map[i][j] + min(dp[i-1]j, dp[i][j-1]) if i=[1,n), j=[1,m)
C++實現
#include <iostream>
#include <vector>
using namespace std;
class Solution{
public:
int MinPath(int map[4][4], int n, int m){
int dp[n][m];
dp[0][0] = map[0][0];
for(int i=1; i< n; i++)
dp[i][0] = dp[i-1][0] + map[i][0];
for (int j=1; j<m; j++)
dp[0][j] = dp[0][j-1] + map[0][j];
for (int i=1; i<n; i++){
for (int j=1; j<m; j++){
dp[i][j] = map[i][j] + min(dp[i-1][j] , dp[i][j-1]);
}
}
// iteration dp
cout << "dp of map:" << endl;
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
cout << dp[i][j] << ' ';
}
cout << endl;
}
return dp[n-1][m-1];
}
};
int main(){
int map[4][4]={{1,3,5,9},{8,1,3,4},{5,0,6,1},{8,8,4,0}};
Solution s;
int res = s.MinPath(map,4,4);
cout << "MinPath of map: " << res << endl;
return 0;
}