LeetCode Minimum Path Sum
class Solution { public: int min(int a, int b) { return a>b?b:a; } int getMin(vector<vector<int> > grid, int m, int n) { int current = 1, next = 0; vector<int> q[2]; q[0].clear(); q[1].clear(); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(i==0 && j==0) q[current].push_back(grid[0][0]); else if(i==0) q[current].push_back(q[current][j-1] + grid[i][j]); else if(j==0) q[current].push_back(q[next][j] + grid[i][j]); else { q[current].push_back(min( q[current][j-1], q[next][j]) + grid[i][j]); } } current = !current; next = !next; q[current].clear(); } return q[next][n-1]; } int minPathSum(vector<vector<int> > &grid) { int m = grid.size(); int n = grid[0].size(); return getMin(grid,m,n); } };
解题思路:比较明显的DP问题,这种问题一般不要用递归,会引起很多重复子问题,除非你剪枝,所以可以用一个二维数组来存当前状态的最低cost,从起点开始递推,一步两步,一步两步似爪牙,0.0
如果按照上面的思路那么需要n x n的额外空间,如果采用交替轮回数组可以只用2 x n个空间,屌爆了简直,
递推公式:如果当前状态在第一行,那么只能由第一行该元素左边一个元素到达
如果当前状态在第一列,那么只能由第一列的该元素上面的元素到达
如果当前状态在中间,那么可以由该元素的上面元素和左边元素中较小的那个元素到达,将两者的较小值加上当前元素节点的值,构成当前状态的cost