[Leecode] Minimum Path Sum解法

目录

 

题目

我的做法

正确做法

代码


题目

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.

翻译过来就是给你一个m*n的方阵,然后从左上角开始移动到右下角,使移动的路径上的数字之和最小,然后输出这个最小的路径。移动的时候只能往右移动或者往下移动。

我的做法

这个题目是动态规划栏目下的一个题目。但是说实话动态规划的精髓我还没有掌握,第一次看到这道题最先出现的想法是暴力搜索。深搜的话由于是函数的形式感觉写递归很麻烦,所以一开始选择了广搜来实现。然后花费了差不多1个小时的时间写代码debug(可见已经有多久没有做过代码题了),然后还是wrong answer。代码已经写了老长了,突然觉得,一定是方法不对。于是乎在网上搜了一下。发现这其实是一种很经典很简单的动态规划问题。嗯我自己之前并没有学过动态规划是什么也没有做过相关训练突然觉得自己超级lowbee。

正确做法

思想就是维护一个大小相同的二维数组,保存到达此位置的最小路径和。如果只能往右移或者往下移的话,第一行和第一列位置的最小路径很容易确定,然后不断从路径和最小的位置上移动到下一位置。到达终点的时候方可得到整个地图到达所有位置的最小路径和。时间复杂度O(N^2)

代码

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

猜你喜欢

转载自blog.csdn.net/qq_36303832/article/details/82501924