동적 계획 -----매트릭스 최소 경로 및

1327 단어
칸마다 권한이 있는 행렬 맵이 있습니다.왼쪽 상단의 칸부터 매번 오른쪽이나 아래로 갈 수 있고 마지막으로 오른쪽 하단의 위치에 도달한다. 경로의 모든 숫자를 누적하면 경로와 모든 경로의 가장 작은 경로와 되돌아간다.
매트릭스 맵과 그 줄 n, 열 m 을 지정하려면 최소 경로와 줄 수를 되돌려 주십시오.보증 행렬 수는 모두 100보다 작다.
아이디어:
n*m의 행렬 dp를 만듭니다. 그 중에서 dp[i][j]는 위치(0,0)에서 (i,j)에 이르는 최소 경로를 나타냅니다. dp의 첫 번째 줄인 dp[0][j]의 값은 (0,0)에서 계속 오른쪽으로만 도달할 수 있습니다. 이 줄의 값 맵[0][j]의 누적입니다.dp의 첫 번째 열인 dp[i][0]의 값은 (0,0)에서 끊임없이 아래로 내려갈 수 있으며 이 줄의 값인 맵[i][0]를 누적할 수 있다.다른 위치의 값 dp[i][j]에 대해서는 [i-1][j]만 아래로 내려가거나 dp[i][j-1]이 오른쪽으로 한 걸음 내려가기 때문에 dp[i][j]=map[i][j]+min(dp[i-1][j], dp[i][j][j]], [j][j]].
매 dp의 값을 계산하고 마지막 dp[n-1][m-1]의 값은 구한 값이다
int min(int a, int b)
  {
	  if (a < b)
		  return a;
	  else
		  return b;
 }
  int getMin(vector > map, int n, int m) 
  {
	  vector > 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]);//           ,        [i-1][j]   ,   [i][j-1]   ,        
		  }
	  }
	  return dp[n - 1][m - 1];
  }

좋은 웹페이지 즐겨찾기