leetcode 64. Minimum Path Sum DP动态规划

来源:互联网 发布:网络博客推广话术 编辑:程序博客网 时间:2024/06/08 04:47

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.

和上一道题leetcode 62. Unique Paths 和 leetcode 63. Unique Paths II 一模一样,不过这里求的是最小的路径之和。

代码如下:

public class Solution {    /*     * 这个和之前的动态规划方法很类似,     * */    public int minPathSum(int[][] mat)     {        //特殊情况        if(mat==null || mat.length<=0)            return 0;        int [][]vis=new int[mat.length][mat[0].length];        vis[0][0]=mat[0][0];        //动态规划的第一行和第一列的初始化,注意要累积权重值        for(int i=1;i<mat.length;i++)            vis[i][0]=vis[i-1][0]+mat[i][0];        for(int i=1;i<mat[0].length;i++)            vis[0][i]=vis[0][i-1]+mat[0][i];        //每一次更新最小的值        for(int i=1;i<mat.length;i++)        {            for(int j=1;j<mat[0].length;j++)                vis[i][j]=Math.min(vis[i-1][j],vis[i][j-1])  +  mat[i][j];        }        return vis[mat.length-1][mat[0].length-1];    }}

和上面的体基本保持一致,就是一个DP的简单应用

代码如下:

#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution {public:    int minPathSum(vector<vector<int>>& gg)     {        if (gg.size() <= 0)            return 0;        vector<vector<int>> dp = gg;        for (int i = 1; i < gg.size(); i++)            dp[i][0] = dp[i-1][0] + gg[i][0];        for (int i = 1; i < gg[0].size(); i++)            dp[0][i] = dp[0][i - 1] + gg[0][i];        for (int i = 1; i < gg.size(); i++)        {            for (int j = 1; j < gg[0].size(); j++)            {                dp[i][j] = gg[i][j] + min(dp[i-1][j], dp[i][j-1]);            }        }        return dp[dp.size() - 1][dp[0].size() - 1];    }};
原创粉丝点击