题目:
一个 n x n 整数矩阵 arr ,请返回 非零偏移下降路径 数字和的最小值。
非零偏移下降路径 定义为:从 arr 数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。
思路:
从整数矩阵arr的顶部到底部,定义dp[i][j]
为从顶部到第i行,第j个数的 非零偏移下降路径 数字和的最小值,则答案为min(dp[n-1][i]),0<=i<=n-1
。记第i-1行的最小值为first,次小值为second。则状态转移方程为 dp[i][j]=first+arr[i][j],first和arr[i][j]不同一列 d[i][j] = second+arr[i][j],first和arr[i][j]同一列
。边界dp[0][i] = arr[0][i] ,0<=i<=n-1
,时间复杂度为O(n2),空间复杂度为O(1)
代码:
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& grid) {
int n = grid.size();
int first_sum = 0,first_pos = -1,second_sum = 0;
for(int i = 0;i < n;i++) {
int fs = INT_MAX,fp = -1,ss = INT_MAX;
for(int j = 0;j < n;j++) {
int cur_sum = (first_pos != j ? first_sum : second_sum) + grid[i][j];
if (cur_sum < fs) {
ss = fs;
fs = cur_sum;
fp = j;
}
else if(cur_sum < ss) {
ss = cur_sum;
}
}
first_sum = fs;
second_sum = ss;
first_pos = fp;
}
return first_sum;
}
};