思路:线性DP
其实这道题和那一道典型的三角形求和题很相似,与此题相比,做了以下几个变动:
第一,就是对于状态变多了一个,不再是从下方的左右了,而是正下和左右,三个状态;
第二,就是对于最佳结果求值的时候,需要从最后我们遍历出来的那第一行dp里面选出来一个最小值才行,不能直接上结果。
上代码:
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
int n=matrix.size();
if(n==0)
return 0;
if(n==1)
return matrix[0][0];
vector<vector<int>>dp(n+2,vector<int>(n+2,INT_MAX));
for(int i=0;i<n;i++)
dp[n][i+1]=matrix[n-1][i];
for(int i=n-1;i>=1;i--){
for(int j=1;j<=n;j++){
dp[i][j]=min(dp[i+1][j],min(dp[i+1][j+1],dp[i+1][j-1]))+matrix[i-1][j-1];
}
}
int res=INT_MAX;
for(int i=1;i<=n;i++){
res=min(res,dp[1][i]);
}
return res;
}
};