LeetCode-64.Minimum Path Sum

来源:互联网 发布:行知实验园 编辑:程序博客网 时间:2024/05/16 00:53

https://leetcode.com/problems/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.

简单的DP问题

public int MinPathSum(int[,] grid)     {        int m = (int)grid.GetLongLength(0);        int n = (int)grid.GetLongLength(1);        if (m * n == 0)            return 0;        if (m * n == 1)            return grid[0, 0];        int[,] mat = new int[m,n];        mat[0, 0] = grid[0, 0];        for (int j = 1; j < n; j++)            mat[0, j] = mat[0, j - 1] + grid[0, j];        for (int i = 1; i < m; i++)            mat[i, 0] = mat[i-1,0] + grid[i,0];        for (int i = 1; i < m; i++)        {            for (int j = 1; j < n; j++)            {                mat[i, j] = Math.Min(mat[i, j - 1], mat[i - 1, j]) + grid[i, j];            }        }        return mat[m - 1, n - 1];    }

优化一下,节省空间

public int MinPathSum(int[,] grid)     {        int m = (int)grid.GetLongLength(0);        int n = (int)grid.GetLongLength(1);        if (m * n == 0)            return 0;        if (m * n == 1)            return grid[0, 0];        int[] mat = new int[n];        mat[0] = grid[0, 0];        for (int j = 1; j < n; j++)            mat[j] = mat[j - 1] + grid[0, j];        for (int i = 1; i < m; i++)        {            for (int j = 0; j < n; j++)            {                if (j == 0)                    mat[j] += grid[i, j];                else                    mat[j] = Math.Min(mat[j - 1], mat[j]) + grid[i, j];            }        }        return mat[n - 1];    }


0 0