931、下降路径最小和
题目:
解答:
按照行遍历,dp即可。定义dp[i][j]为(i,j)位置的最小路径。
初始化:第一行直接塞入dp[0][j]。
遍历:最左边、最右边的可行路径为两种,中间n-2个数的可行路径为三种。一共三种情况,分开讨论即可。遍历到n-1行。
优化空间,dp[0][j]存储上一行,dp[1][j]存储当前行,本行计算完成后dp[0][j]=dp[1][j]
最后遍历最后一行,寻找最小值即可。ans=100*n是一个最大值,只要足够大即可。
class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {int n = matrix.size();if(n==1) return matrix[0][0];//2行n列vector<vector<int>> dp(2,vector<int>(n));for(int i=0;i<n;i++)dp[0][i] = matrix[0][i];for(int j=1;j<n;j++){dp[1][0] = matrix[j][0] + min(dp[0][0],dp[0][1]);dp[1][n-1] = matrix[j][n-1] + min(dp[0][n-2],dp[0][n-1]);for(int i=1;i<n-1;i++){dp[1][i] = matrix[j][i] + min(dp[0][i-1],min(dp[0][i],dp[0][i+1]));}for(int i=0;i<n;i++)dp[0][i] = dp[1][i];}int ans = n*100;for(int i=0;i<n;i++)ans = min(ans,dp[1][i]);return ans;}
};
时间复杂度O(n*n)
空间复杂度O(n)