标签:mission sub line pre targe for leetcode path 初始
这一题目首先需要弄懂题目的意思,下降路径最小和指的是在方阵中可以从上往下行走,走过后获得的值最小,方向可以是走左下,右下,直下。
题目和传统的动态规划一样,把边界的值先初始化,然后通过状态转移一步一步到最后一行
我们有dp[i][j]:意思是终点为(i,j)的下降路径最小值
状态方程为
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i-1][j+1])+A[i][j] ;
分别代表从左上(i-1,j-1),从正上方(i-1,j),从右上方(i-1,j+1)三种情况。求这三种情况的最小值即可。
答案很明显就是最后一行的最小值了,我们只需要调用STL自带的min_element或者for循环遍历即可找到。
我提交的代码如下,超越了100%的提交用户
class Solution { public: inline int min3(const int a,const int b,const int c){ int ans=a; if(b<ans)ans=b; if(c<ans)ans=c; return ans; } int minFallingPathSum(vector<vector<int>>& A) { int t = A.size(); int dp[t][t]; for (int j = 0; j < t; j++) { dp[0][j] = A[0][j]; } for (int i = 1; i < t; i++) { dp[i][0] = min(dp[i-1][0], dp[i-1][1]) + A[i][0]; dp[i][t - 1] = min(dp[i-1][t - 1], dp[i-1][t-2]) + A[i][t - 1]; int tmp = 0; for (int j = 1; j < t - 1; j++) { dp[i][j] = min3(dp[i-1][j + 1], dp[i-1][j-1], dp[i-1][j]) + A[i][j]; } } return *min_element(dp[t - 1], dp[t-1]+t); } };
这段代码还做了几个改进,
标签:mission sub line pre targe for leetcode path 初始
原文地址:https://www.cnblogs.com/adamwong/p/10205102.html