动态规划,dp[i][j]代表到i行j列的非0偏移的路径和,答案是min(dp[n-1][]),最后一行的最小值;
更新过程中,dp[i][j] = min(dp[i][j], arr[i][j] + dp[i-1][k]) k∈[0, n-1] k≠j
总体 O ( N 3 ) O(N^3) O(N3)复杂度,标签是困难估计是给 O ( N 2 ) O(N^2) O(N2)复杂度的,就是记录每行的最小和次小,避免k的那一重循环,有兴趣的可以自行尝试。
另外dp[i][] 只与 dp[i-1][] 有关,可以用两个一维数组滚动更新。
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& grid) {
int n = grid.size();
if(n == 1) return grid[0][0];
vector<int> f = grid[0];
for(int i = 1; i < n; i++) {
vector<int> tmp(n, 1e6);
for(int j = 0; j < n; j++) {
for(int k = 0; k < n; k++) {
if(k == j) continue;
tmp[j] = min(tmp[j], grid[i][j] + f[k]);
}
}
f = tmp;
}
int ans = 1e6;
for(auto x : f) ans = min(ans, x);
return ans;
}
};