【动态规划】下降路径最小和 C++
下降路径最小和(难度:中等)
该题对应力扣网址
思路
题目中提到:
位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1)
那么当我们反推的时候,dp[i][j]是由它的左上方,正上方,右上方的数字决定的,即dp[i-1][j-1],dp[i-i][j],dp[i-1][j+1]
每次从这三个位置的数据找最小的,这样就能确保,当下降到最后一行的时候,存储的路径和是最小的。
AC代码
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[m-1].size();
vector <vector<int>> dp (m, vector<int>(n));
int result=INT_MAX;
//用dp[0][0]初始化matrix[0]这一行的所有值
copy(matrix[0].begin(),matrix[0].end(),dp[0].begin());
int num1;
int num3;
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
num1=INT_MAX;
num3=INT_MAX;
if(j>0){
num1=dp[i-1][j-1]+matrix[i][j];
}
int num2=dp[i-1][j]+matrix[i][j];
if((j+1)<n){
num3=dp[i-1][j+1]+matrix[i][j];
}
int temp;
result=min({num1,num2,num3});
dp[i][j]=result;
}
}
return *min_element(dp[n-1].begin(),dp[n-1].end());
}
};
补充:新的代码用法
*min_element()
函数可以直接返回一个一维数组中最小值
return *min_element(dp[n-1].begin(),dp[n-1].end());