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

posted @ 2014-12-05 14:20  ElephantKing  阅读(132)  评论(0编辑  收藏  举报