前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 931. Minimum falling path sum 最小下降路径和(动态规划)

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

作者头像
racaljk
发布2018-12-06 10:21:31
5820
发布2018-12-06 10:21:31
举报
文章被收录于专栏:racaljkracaljk

题目描述

已知一个正方形二维数组A,我们想找到一条最小下降路径的和

所谓下降路径是指,从一行到下一行,只能选择间距不超过1的列(也就是说第一行的第一列,只能选择第二行的第一列和第二列;第二行的第二列,只能选择第三行的第一列第二列第三列),最小下降路径就是这个路径的和最小

测试样例

代码语言:javascript
复制
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)

总结规律即可

算法实现

代码语言:javascript
复制
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()]);
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 测试样例
  • 详细分析
  • 算法实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档