算法训练:Minimum Path Sum

来源:互联网 发布:pdf合并拆分的软件 编辑:程序博客网 时间:2024/06/07 01:06

题目链接:https://leetcode.com/problems/minimum-path-sum/#/description


题目描述:

        给定一个全为正整数的 m X n 的矩阵, 取一条从左上为起点, 走到右下为终点的路径,求一条所经过元素和最小的一条路径(前进方向只能向下或者向右)

解题思路:

         递归:
       从最后右下点(终点)开始递归求解。缺点:会重复计算。
    //递归实现    int minpath(int i,int j,vector<vector<int>>grid){        if( i==0 && j==0)  return grid[0][0];        //注意边界情况        if(i==0) return minpath(0,j-1,grid)+grid[i][j];          if(j==0) return minpath(i-1,0,grid)+grid[i][j];         return min(minpath(i-1,j,grid),minpath(i,j-1,grid))+grid[i][j];//从右下角点向前递归    }    int minPathSum(vector<vector<int>>& grid) {        int row=grid.size();        int col=grid[0].size();        return minpath(row-1,col-1,grid);    }

     
 动态规划:

      sum[i][j]:从第一个数grid[0][0]到grid[i][j]的最小路径和。(状态)

      边界情况:第一列:sum[i][0]=sum[i-1][0]+grid[i][0];    第一行:sum[0][j]=sum[0][j-1]+grid[0][j];

      递推公式(最优解结构):sum[i][j]=min(sum[i-1][j],sum[i][j-1])+grid[i][j];

   //动态规划   int minPathSum(vector<vector<int>>& grid) {        int row=grid.size();        int col=grid[0].size();        vector<vector<int>>sum(row,vector<int>(col,0));//初始化        //边界情况        sum[0][0]=grid[0][0];        for(int i=1;i<row;i++){            sum[i][0]=sum[i-1][0]+grid[i][0];        }        for(int j=1;j<col;j++){            sum[0][j]=sum[0][j-1]+grid[0][j];        }        for(int i=1;i<row;i++){            for(int j=1;j<col;j++){                sum[i][j]=min(sum[i-1][j],sum[i][j-1])+grid[i][j];            }        }        return sum[row-1][col-1];    }

运行结果:

Your Input
[[0,1,2],[2,1,4],[1,5,6]]
Your answer
12
Expected answer
12











0 0
原创粉丝点击