题目
给你一个
n x n
整数矩阵grid
,请你返回 非零偏移下降路径 数字和的最小值。非零偏移下降路径 定义为:从
grid
数组中的每一行选择一个数字,且按顺序选出来的数字中,相邻数字不在原数组的同一列。
示例 1:
![](https://i-blog.csdnimg.cn/blog_migrate/8af0ed1d9371c2b55b2c4d6b3f55272f.jpeg)
输入:grid = [[1,2,3],[4,5,6],[7,8,9]]
输出:13
解释:所有非零偏移下降路径包括:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]下降路径中数字和最小的是 [1,5,7] ,所以答案是 13 。
示例 2:
输入:grid = [[7]]
输出:7
提示:
n == grid.length == grid[i].length
1 <= n <= 200
-99 <= grid[i][j] <= 99
思路(动态规划)
此题和931. 下降路径最小和相似,都是求从第0行下降到最后一行的最小路径和,这里我们可以构建一个二维数组df[n][n]
,其中的每个元素表示从起始位置到当前位置(i,j)
的最小路径,不难得出df
的第一行值和grid
数组第一行值相等,而df
中的(i,j)
元素则是由第i - 1
行元素中,除了df[i - 1][j]
元素之外的其它元素的最小值加上当前grid[i][j]
得来
#define MIN(A,B) ((A) < (B) ? (A) : (B))
int minFallingPathSum(int** grid, int gridSize, int* gridColSize){
int ret = INT_MAX;
int i = 0, j = 0, k = 0;
int row = gridSize;
int col = gridColSize[0];
//构建df
int** df = malloc(sizeof(int*) * row);
for(i = 0; i < row; i++)
df[i] = malloc(sizeof(int) * col);
for(j = 0; j < row; j++)
df[0][j] = grid[0][j];
for(i = 1; i < row; i++){
for(j = 0; j < col; j++){
df[i][j] = INT_MAX; //每一个元素都为整型最大值方便后续操作
}
}
for(i = 1; i < row; i++){
for(j = 0; j < col; j++){
for(k = 0; k < col; k++){
if(k == j) continue; //当为零偏移时跳过该次
df[i][j] = MIN(df[i][j],grid[i][j] + df[i-1][k]);
}
}
}
//获取最后一行的最小值
for(j = 0; j < col; j++)
ret = MIN(ret,df[row - 1][j]);
//回收分配的内存空间
for(j = 0; j < col; j++)
free(df[j]);
free(df);
return ret;
}