Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

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()]); } };

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzwdz.html