每天一道算法题【蓝桥杯】【下降路径最小和】

每天一道算法题【蓝桥杯】【下降路径最小和】_第1张图片
每天一道算法题【蓝桥杯】【下降路径最小和】_第2张图片
每天一道算法题【蓝桥杯】【下降路径最小和】_第3张图片

思路

使用dp表来解决问题

为了方便填写dp表,多初始化一圈格子

状态转移方程

dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];
每个元素等于上一行元素最小的那个加上本格元素

最后遍历最后一行dp表找最小值

for (int j = 1; j <= n; j++)
ret = min(ret, dp[n][j]);

#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
class Solution {
public:
    int minFallingPathSum(vector>& matrix) {
        int n = matrix.size(), ret = INT_MAX;
        vector> dp(n + 1, vector(n + 2, INT_MAX));//把dp表中所有元素设为INT_MAX
        for (int j = 0; j < n + 2; j++)
            dp[0][j] = 0;            //第一行设为0
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];//每个元素等于上一行元素最小的那个加上本格元素
        for (int j = 1; j <= n; j++)
            ret = min(ret, dp[n][j]);                      //求dp表最后一行的最小值
        return ret;


    }
};

你可能感兴趣的:(题解,算法,蓝桥杯,c++,leetcode)