Leetcode64 minimum path sum

来源:互联网 发布:mac卸载梦幻西游 编辑:程序博客网 时间:2024/06/05 02:28

最近在学习DP 很容易的想到了下面的解法

我的解法

int minPathSum(vector<vector<int> >& grid) {    //handle exception    if (grid.empty())        return 0;    //grid is not null    int m = grid.size();    int n = grid[0].size();    vector<vector<int> > dp(m, vector<int>(n));    //init dp table    //init 0,0 pos    dp[0][0] = grid[0][0];    //init 第一横行    for (int i = 1; i < m; i++) {        dp[i][0] = dp[i - 1][0] + grid[i][0];    }    //init 第一纵列    for (int j = 1; j < n; j++) {        dp[0][j] = dp[0][j - 1] + grid[0][j];    }    for (int i = 1; i < m; i++)        for (int j = 1; j < n; j++) {            dp[i][j] = min(dp[i - 1][j], dp[i][j - 1])                + grid[i][j];        }    return dp[m -1][n -1];}

至此AC

dp[i][j] = min(dp[i - 1][j], dp[i][j - 1])
+ grid[i][j];
这个递推式比较关键,ij位置上的minimum path由上方和左方的最小值 加上 grid表中本格的数值相加而成.

贪心的反例(为什么不能用贪心)

A B C 0 1 100 2 100 100 1 1 1

看这个表格 贪心会导致从0,0 走到 0, 1 然后一定会经过100
而正确走法应当走1, 0

所以这题不能用贪心

优化

这题空间复杂度上可以优化
可以将dp表从二维节约成一维, 在循环中更新表即可, 最后返回所需函数值即可.

0 0
原创粉丝点击