Arithmetic Slices
题目描述
leetcode.64
Given a square array of integers A, we want the minimum sum of a falling path through A.
A falling path starts at any element in the first row, and chooses one element from each row. The next row’s choice must be in a column that is different from the previous row’s column by at most one.
Example 1:
Input: [[1,2,3],[4,5,6],[7,8,9]]
Output: 12
Explanation:
The possible falling paths are:
[1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
[2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
[3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
The falling path with the smallest sum is [1,4,7], so the answer is 12.
给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和。
下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。
示例:
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:12
解释:
可能的下降路径有:
[1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
[2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
[3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
和最小的下降路径是 [1,4,7],所以答案是 12。
解题
这题属于求路径最小和的一个变形,关键在于是从上到下求最小路径,而不是从做上到右下的最小路径,做上到右下的话因为首尾点固定,因此每个位置的和固定,但本题不一样。
解法为每个格子的最小路径为,它上一行相邻三个中最小的一个与当前格子的加和。
借用一张别人的图
状态转移方程为:
d
p
[
i
]
[
j
]
=
d
p
[
i
]
[
j
]
+
m
i
n
(
d
p
[
i
−
1
]
[
j
]
,
m
i
n
(
d
p
[
i
−
1
]
[
j
−
1
]
,
d
p
[
i
−
1
]
[
j
+
1
]
)
)
dp[i][j]=dp[i][j]+min(dp[i-1][j],min(dp[i-1][j-1],dp[i-1][j+1]))
dp[i][j]=dp[i][j]+min(dp[i−1][j],min(dp[i−1][j−1],dp[i−1][j+1]))
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& A) {
int rows = A.size();
int cols = A[0].size();
vector<vector<int>> dp(rows+2,vector<int>(cols+2,0));
for(int i=0;i<rows;i++)
{
dp[i][0] = INT_MAX;
dp[i][cols+1] = INT_MAX;
for(int j=1;j<cols+1;j++)
{
dp[i][j] = A[i][j-1];
}
}
for(int i=1;i<rows;i++)
{
for(int j=1;j<cols+1;j++)
{
dp[i][j] = dp[i][j]+min(dp[i-1][j],min(dp[i-1][j-1],dp[i-1][j+1]));
}
}
int res = INT_MAX;
for(int i=1;i<cols+1;i++)
res = min(res,dp[rows-1][i]);
return res;
}
};