【算法笔记】动态规划——走棋盘的最短路径

版权声明:本文为博主原创文章,如需转载,请注明出处: https://blog.csdn.net/MASILEJFOAISEGJIAE/article/details/89766244

题目描述

一个棋盘有n行m列,从棋盘的左上角走到右下角,每次只能往右走一步,或者往下走一步,每个格子都有一个数字,求怎样走才能使走过的数字总和最小。

举例

Input:
[ [1,3,1],
[1,5,1],
[4,2,1] ]
Output: 7
(因为路径1->3->1->1->1能求得最小的总和7)

解题思路

这道题是典型的动态规划问题,是问题动态规划:走棋盘的变种。

#include <vector>

class Solution
{
  public:
    int min(const int &a, const int &b)
    {
        return a < b ? a : b;
    }

    int minPathSum(vector<vector<int>> &grid)
    {
        int n = grid.size();    //行
        int m = grid[0].size(); //列

        int s[200][200];

        s[0][0] = grid[0][0];

        //填充第一列
        for (int i = 1; i < n; i++)
        {
            s[i][0] = s[i - 1][0] + grid[i][0];
        }

        //填充第一行
        for (int j = 1; j < m; j++)
        {
            s[0][j] = s[0][j - 1] + grid[0][j];
        }

        for (int i = 1; i < n; i++)
        {
            for (int j = 1; j < m; j++)
            {
                s[i][j] = min(s[i - 1][j], s[i][j - 1]) + grid[i][j];
            }
        }

        return s[n - 1][m - 1];
    }
};

LeetCode链接:LeetCode 64. Minimum Path Sum

猜你喜欢

转载自blog.csdn.net/MASILEJFOAISEGJIAE/article/details/89766244