[64]Minimum Path Sum

来源:互联网 发布:怎样举报网络非法赌博 编辑:程序博客网 时间:2024/06/05 15:51

【题目描述】

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.

【思路】

1.还是用深搜+记录前面的最小pathsum

2.很明显的动归题目。状态方程为:s(m,n)=min(s(m-1,n),s(m,n-1))+grid(m,n).

3.是对2的改进,采用动归+滚动数组,虽然耗时反而比2多。。

【代码】

1.

class Solution {public:    vector<vector<int>> f;    int minPathSum(vector<vector<int>>& grid) {        int m=grid.size();        int n=grid[0].size();        this->f=vector<vector<int>>(m,vector<int>(n,-1));        return dfs(grid,m-1,n-1);    }    int dfs(vector<vector<int>>& grid,int a,int b){        if(a<0||b<0) return INT_MAX;        if(a==0&&b==0) return grid[0][0];        return min(updatef(grid,a-1,b),updatef(grid,a,b-1))+grid[a][b];    }    int updatef(vector<vector<int>>& grid,int a,int b){        if(a<0||b<0) return INT_MAX;        if(f[a][b]>=0) return f[a][b];        f[a][b]=dfs(grid,a,b);        return f[a][b];    }};

2.

class Solution {public:    int minPathSum(vector<vector<int>>& grid) {        int m=grid.size();        int n=grid[0].size();        vector<vector<int>> ans(m,vector<int>(n,0));        ans[0][0]=grid[0][0];        for(int i=1;i<m;i++){            ans[i][0]=grid[i][0]+ans[i-1][0];        }        for(int i=1;i<n;i++){            ans[0][i]=grid[0][i]+ans[0][i-1];        }        for(int i=1;i<m;i++){            for(int j=1;j<n;j++){                ans[i][j]=min(ans[i-1][j],ans[i][j-1])+grid[i][j];            }        }        return ans[m-1][n-1];    }};

3.

class Solution {public:    int minPathSum(vector<vector<int>>& grid) {        int m=grid.size();        int n=grid[0].size();        //vector<vector<int>> ans(m,vector<int>(n,0));        vector<int> ans(n,INT_MAX);        ans[0]=0;        for(int i=0;i<m;i++){               ans[0]+=grid[i][0];            for(int j=1;j<n;j++){                ans[j]=min(ans[j],ans[j-1])+grid[i][j];            }        }        return ans[n-1];    }};


0 0
原创粉丝点击