leetcode 64 - Minimum Path Sum
문제
leetcode 64 - Minimum Path Sum 풀러가기
문제 분석
이 문제는 (0,0)에서 오른쪽 하단으로 가는 경로의 최소 합을 구하는 문제다.
현재 위치를 (i,j)라고 할 때, (i,j)까지의 경로의 최소 합은 모든 경우에 동일 하다. 따라서 Dynamic Programming 으로 풀 수 있다.
현재 위치까지의 최소 합을 d [ i ] [ j ]로 표현하여 점화식을 세운다면
d [ i ] [ j ] = min(d [ i - 1] [ j ] , d [ i ] [ j - 1]) + 현재 위치의 값이 된다.
문제 풀이(C++)
-
전체 코드
1234567891011121314151617181920212223242526272829303132333435#include <algorithm>class Solution {public:int minPathSum(vector<vector<int>>& grid) {if(grid.empty()){return 0;}int n = grid.size();int m = grid[0].size();vector<vector<int>> d(n, vector<int>(m, 0));return go(grid, d, n-1, m-1);}int go(vector<vector<int>>& grid, vector<vector<int>>& d, int i, int j){if(d[i][j] != 0){return d[i][j];}if(i==0 && j==0){return grid[0][0];}else if(i==0){d[i][j] = go(grid, d, i, j-1)+grid[i][j];}else if(j==0){d[i][j] = go(grid, d, i-1, j)+grid[i][j];}else{d[i][j] = min(go(grid, d, i-1, j), go(grid, d, i, j-1))+grid[i][j];}return d[i][j];}};cs
- 20번째 줄 : d[ i ] [ j ]의 값이 있다는 것은, 이미 그 위치의 최소 합을 구했다는 것이다. 따라서 그 경우에는 d[ i ] [ j ]를 그대로 반환한다.
- 24번째 줄 : 0,0일 때는, 그냥 (0,0)에서의 값을 반환하면 된다.
- 26번째 줄 : i가 0일때는 i-1을 할 수 없으므로 j-1만 할 수 있다.(28번째도 마찬가지)
- 30번째 줄 : 위에서 말한 점화식을 코딩으로 표현.
아직 배움의 과정에 있는 학생이니 내용에 부족한 점이 보이면 지적은 하되, 비난은 하지 말아주세요!!
댓글남기기