Leetcode 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.

做这题之前,建议先看一下Leetcode Triangle

这题看懂了,然后把矩阵右旋45度后,再看此题感觉很相似,

把斜次对角线(包括主对角线)看成行,然后按照Leetcode Triangle的思路去做即可

如矩阵(矩阵的行数为n,矩阵的列数为m)

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

对于每一行分别对于原始矩阵列的第1~m个元素

决策变量为dp[i][j], 表示左上角到达第i行第j个元素最短路径

动态转移方程为dp[i][j] = min(dp[i][j-1],dp[i-1][j]) + grid[i][j]

由于二维数组空间比较大,本题对空间进行优化

 

矩阵旋转45度后为

       1

     1   1

   1  1  1

1   1   1   1

   1   1   1

     1   1

       1

你会发现dp[i][j-1]和dp[i-1][j]处在同一行的相领元素,而他们之间下面的元素为dp[i][j],就类似Leetcode Triangle

由于上一行的信息在下一行后不会用到,故利用滚动数组的去解决

int minPathSum(vector<vector<int> >& grid){
    if(grid.empty()) return 0;
    int n = grid.size(), m = grid[0].size();
    vector<int> dp(m+1,INT_MAX);
    dp[1] = 0;
    for(int i = 0 ; i < n; ++ i){
        for(int j = 0; j < m ; ++ j){
            dp[j+1] = min(dp[j],dp[j+1]) + grid[i][j];
        }
    }
    return dp[m];
}

 

 

posted @ 2014-06-22 22:49  OpenSoucre  阅读(429)  评论(0编辑  收藏  举报