一到简单的DP,一遍AC
当前行状态受上一行的状态约束,很容易写出状态转移方程
dp[i][j]=min(min(dp[i-1][j-1], dp[i-1][j+1]), dp[i-1][j])+A[i][j];
需要处理的是首尾两列,完整代码如下:
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& A) {
int dp[101][101];
for(int j=0; j<A.size(); ++j) dp[0][j] = A[0][j];
for(int i=1; i<A.size(); ++i)
{
for(int j=0; j<A.size(); ++j)
{
if(j == 0)
{
dp[i][j] = min(dp[i-1][j+1], dp[i-1][j])+A[i][j];
}
else if(j == A.size()-1)
{
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j])+A[i][j];
}
else
dp[i][j]=min(min(dp[i-1][j-1], dp[i-1][j+1]), dp[i-1][j])+A[i][j];
}
}
int Min = 1000;
for(int j=0; j<A.size(); ++j)
{
if(dp[A.size()-1][j] < Min)
Min = dp[A.size()-1][j];
}
return Min;
}
};
下面是讨论区的四行AC代码:
int minFallingPathSum(vector<vector<int>>& A) {
for (auto i = 1; i < A.size(); ++i)
for (auto j = 0; j < A.size(); ++j)
A[i][j] += min({ A[i-1][j], A[i-1][max(0,j-1)], A[i-1][min((int)A.size()-1,j+1)] });
return *min_element(begin(A[A.size() - 1]), end(A[A.size() - 1]));
}
min_element STL 取容器中最小值
min_element(first,end,cmp);
详见:点击打开链接