1. 程式人生 > 實用技巧 >力扣 64.最小路徑和 Minimum Path Sum

力扣 64.最小路徑和 Minimum Path Sum

動態規劃題一直是我的弱項,這道題之前應該是遇到過,但那時自己想不出來,就看了看題解,沒有做。今天力扣的每日一題又遇到了,正好做一下。

力扣 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的判斷。