Leetcode Minimum Path Sum

时间:2023-01-17 21:47:55

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 ;
int n = grid.size(), m = grid[].size();
vector<int> dp(m+,INT_MAX);
dp[] = ;
for(int i = ; i < n; ++ i){
for(int j = ; j < m ; ++ j){
dp[j+] = min(dp[j],dp[j+]) + grid[i][j];
}
}
return dp[m];
}