1. 程式人生 > >【leetcode931】 下降路徑最小和(基礎DP)

【leetcode931】 下降路徑最小和(基礎DP)

題目:

一個矩陣,從上到下走一遍,只允許走相鄰的列,然後每一個位置有一個權值,求經過路徑的最小權值和。

思路:

基礎DP了,dp[i][j]表示到達位置(i,j)所需要的花費的權值。那麼他可以由三種狀態轉化而來。

(i-1,j-1),(i-1,j),(i-1,j+1)就是上一列與其相鄰列的三個位置。(注意邊界的時候需要分類討論)

所以dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i-1][j+1])+value[i][j]

程式碼:

class Solution {
public:
int minFallingPathSum(vector<vector<int>>& A) {
    int dp[105][105];
    int sz = A.size();
    for(int i=0;i<sz;i++)dp[0][i] = A[0][i];
    for(int i=1;i<sz;i++){
        for(int j=0;j<sz;j++){
            if(j==0)dp[i][j] = min(dp[i-1][j],dp[i-1][j+1])+A[i][j];
            else if(j==sz-1)dp[i][j] = min(dp[i-1][j],dp[i-1][j-1])+A[i][j];
            else {
                dp[i][j] = min(dp[i-1][j],dp[i-1][j-1])+A[i][j];
                dp[i][j] = min(dp[i][j],dp[i-1][j+1]+A[i][j]);
            }
        }
    }
    int ma = 1e9;
    for(int i=0;i<sz;i++){
        ma = min(ma,dp[sz-1][i]);
    }
    return ma;
}

};