动态规划题一直是我的弱项,这道题之前应该是遇到过,但那时自己想不出来,就看了看题解,没有做。今天力扣的每日一题又遇到了,正好做一下。
力扣 64.最小路径和 Minimum Path Sum 难度:中等
算是比较简单的动规题,f[i][j]=min(f[i][j-1],f[i-1][j]),(边界情况要特殊考虑)
空间复杂度优化,每次只存储上一行的dp值,于是用一维的f就可以了。(这种方法应该也是之前在什么地方看题解看到的,不然我自己肯定想不出来)。
自己写的代码如下,一开始在用第一行对f[i]进行初始化时忘记加上前一项f[i-1]了,就直接f[i]=grid[0][i],导致第一次运行不对,后来修改了之后过了。
class Solution { public: int minPathSum(vector<vector<int>>& grid) { int row=grid.size(),col=grid[0].size(); vector<int> f(col,0);//每一列最小值 int i,j; f[0]=grid[0][0]; for(i=1;i<col;i++) { f[i]=grid[0][i]+f[i-1];//到达第一行的各点,只能从左边来 } for(i=1;i<row;i++) { for(j=0;j<col;j++) { if(j==0) { f[j]=f[j]+grid[i][j];//相当于从上走到[i,j]处的路径和 continue; } f[j]=grid[i][j]+min(f[j],f[j-1]);//选择上方和左侧的最小值,加上当前值 } } return f[col-1]; } };
对照了一下官方的题解,前面还需要加一个对grid.size()为0、或grid[0].size()为0的判断。