Minimum Path Sum

来源:互联网 发布:互通商城 软件靠谱吗 编辑:程序博客网 时间:2024/06/16 23:41

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

思路:这也是一道DP题,f[m][n]表示点(m,n)的最小和,它可由min{f[m-1][n]+grid[m][n],f[m][n-1]+grid[m][n]}得到,然后注意m=0 || m=1 || n=0 || n=1的临界条件即可。

class Solution {private:    vector<vector<int> > f;public:    int minPath(int m, int n, vector<vector<int> > &grid) {        if (m==0 || n==0)        {            return 0;        }            if (f[m][n] != 0)        {            return f[m][n];        }            if (m == 1 && n != 1)        {            f[m][n] = minPath(m,n-1,grid) + grid[m-1][n-1];            return f[m][n];        }        if (m != 1 && n == 1)        {            f[m][n] = minPath(m-1, n, grid) + grid[m-1][n-1];            return f[m][n];        }        if (m == 1 && n == 1)        {            f[m][n] = grid[m-1][n-1];            return f[m][n];        }        int top = minPath(m-1, n, grid);        int left = minPath(m, n-1, grid);        f[m][n] = ((left <= top) ? left + grid[m-1][n-1] : top + grid[m-1][n-1]);        return f[m][n];    }        int minPathSum(vector<vector<int> > &grid) {        int m = grid.size(),i,j;        if (m == 0)        {            return 0;        }            int n = grid[0].size();        f.resize(m+1);        vector<int> line;        for(i=0; i<=m; ++i)        {            line.clear();            line.resize(n+1);            for(j=0; j<=n; ++j)             line[j]= 0;            f[i]= line;        }            return minPath(m,n,grid);    }};


0 0
原创粉丝点击