【动态规划】下降路径最小和 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());