Leetcode 931. Minimum falling path sum 最小下降路徑和(動態規劃)
題目描述
已知一個正方形二維數組A,我們想找到一條最小下降路徑的和
所謂下降路徑是指,從一行到下一行,只能選擇間距不超過1的列(也就是說第一行的第一列,只能選擇第二行的第一列和第二列;第二行的第二列,只能選擇第三行的第一列第二列第三列),最小下降路徑就是這個路徑的和最小
測試樣例
Input: [[1,2,3],[4,5,6],[7,8,9]]
Output: 12
Explanation:
可能的下降路徑是:
[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.
詳細分析
隨便舉個例子:
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
考慮(1,0)這個格子(4)
- (1,0)有dp[1][0] = 4 + min(1,2)
- (1,1)有dp[1][1] = 5 + min(1,2,3)
- (1,2)有dp[1][2] = 6 + min(2,3)
總結規律即可
算法實現
class Solution {
public:
int minFallingPathSum(vector<vector<int>>& A) {
int dp[200][200]={0};
for(int i=0;i<A.size();i++){
dp[0][i]=A[0][i];
}
for(int i=1;i<A.size();i++){
for(int k=0;k<A[0].size();k++){
if(k==0){
dp[i][k] = A[i][k]+ min(dp[i-1][k],dp[i-1][k+1]);
}else if(k==A.size()-1){
dp[i][k] = A[i][k]+ min(dp[i-1][k],dp[i-1][k-1]);
}else{
dp[i][k] = A[i][k]+ min(dp[i-1][k],min(dp[i-1][k-1],dp[i-1][k+1]));
}
}
}
return *min_element(&dp[A.size()-1][0],&dp[A.size()-1][A.size()]);
}
};