LeetCode 64. Minimum Path Sum

来源:互联网 发布:二进制指数退避算法 编辑:程序博客网 时间:2024/06/06 00:02

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[i][j]=min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j].

int min(int a, int b){    return a < b?a:b;}int minPathSum(int** grid, int gridRowSize, int gridColSize) {    int dp[1000][1000] = {0};    int i, j;    dp[0][0] = grid[0][0];    for(i = 0; i < gridRowSize; i ++){        for(j = 0; j < gridColSize; j ++){            if(i == 0 && j > 0) dp[i][j] = dp[i][j - 1] + grid[i][j];            else if(j == 0 && i > 0) dp[i][j] = dp[i - 1][j] + grid[i][j];            else dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];        }    }    return dp[gridRowSize - 1][gridColSize - 1];}

空间优化:

因为每次更新的dp[i][j],是先确定i,再遍历j,每次用到的dp[i - 1][j]或者dp[i][j - 1],都和i无关,只和j有关,i是固定的,所以可以用一维数组表示。

int min(int a, int b){    return a < b?a:b;}int minPathSum(int** grid, int gridRowSize, int gridColSize) {    int dp[1000] = {0};    int i, j;    dp[0] = grid[0][0];    for(i = 0; i < gridRowSize; i ++){        for(j = 0; j < gridColSize; j ++){            if(i == 0 && j > 0) dp[j] = dp[j - 1] + grid[i][j];            else if(j == 0 && i > 0) dp[j] = dp[j] + grid[i][j];            else dp[j] = min(dp[j], dp[j - 1]) + grid[i][j];        }    }    return dp[gridColSize - 1];}


0 0
原创粉丝点击