给定一个填充非负数的m×n网格,找到一条从左上到右下的路径,这个路径将所有数字的总和最小化。

来源:互联网 发布:北京网站排名优化 编辑:程序博客网 时间:2024/06/06 00:44

本题源自leetcode  64

-------------------------------------------------------------------

思路 : 动态规划

1 用一个二维数组dp[i][j]记录到达 i,j 所需要的最小路径和。考虑边界条件。

2 优化 :用一个一维数组来记录到达某一列,需要的最小路径和。

代码:

 int minPathSum(vector<vector<int>>& grid) {        /*        int row = grid.size();        if(row == 0)            return 0;        int col =  grid[0].size();        if(col == 0)            return 0;        vector<vector<int>> dp(row,vector<int>(col,0));        dp[0][0] = grid[0][0];        for(int i = 1; i < row; i++)            dp[i][0] = dp[i-1][0] + grid[i][0];        for(int i = 1; i < col; i++)            dp[0][i] = dp[0][i-1] + grid[0][i];        for(int i = 1; i < row; i++)            for(int j = 1; j < col; j++)                dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j];        return dp[row-1][col-1];        */        int row = grid.size(), col = grid[0].size();        vector<int> dp(col,0);        dp[0] = grid[0][0];        for(int j = 1; j < col; j++)            dp[j] = dp[j - 1] + grid[0][j];        for(int i = 1; i < row; i++){            dp[0] += grid[i][0];            for(int j = 1; j < col; j++)                dp[j] = min(dp[j - 1],dp[j]) + grid[i][j];        }        return dp[col - 1];    }


阅读全文
0 0
原创粉丝点击