1. 程式人生 > >動態規劃--矩陣最小路徑和

動態規劃--矩陣最小路徑和

int min(int a, int b)
  {
	  if (a < b)
		  return a;
	  else
		  return b;
 }
  int getMin(vector<vector<int> > map, int n, int m) 
  {
	  vector<vector<int> > dp;
	  dp.resize(n);//重新定義矩陣dp的大小
	  for (int i = 0; i < n; i++)
	  {
		  dp[i].resize(m);
	  }
	  dp[0][0] = map[0][0];
	  for (int i = 1; i < m; i++)
		  dp[0][i] = dp[0][i - 1] + map[0][i];
	  for (int i = 1; i < n; i++)
		  dp[i][0] = dp[i-1][0] + map[i][0];
	  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]);
		  }
	  }
	  return dp[n - 1][m - 1];
  }


有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。

給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100.

思路:

對於m第一行的所有位置,只能從0,0位置不斷向右到達,所以m第一行每個位置的最小路徑和就是m第一行的值不斷的累加得到的結果,同理m第一列每個位置的最小路徑和就是m第一列的值不斷累加的結果,位置[i][j],要麼是從【i-1】【j】向下到達,要麼從位置【i】【j-1】向右到達。

計算dp的每個值,選擇從左到右的計算每行的位置,然後再從上到下計算每一行,最後最右下角的值就是問題的答案了。