動態規劃 -- 二維數組中左上到右下的最短路徑和。

目錄

 

問題: 

應用場景:

分析:

C++實現 

問題: 

 給定一個二維數組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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章