下降路径最⼩和(medium)

题目描述:

给你一个 n x n 的方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的最小和 。

下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1, col + 1) 。

示例 1:

复制代码
输入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
输出:13
解释:如图所示,为和最小的两条下降路径

示例 2:

复制代码
输入:matrix = [[-19,57],[-40,-5]]
输出:-59
解释:如图所示,为和最小的下降路径

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

题目解析:我们来简单理解一下题意,给你一个二维整数数组,请你找出并返回通过这个整数数组的下降路径的最小和。什么意思呢?从这个二维矩阵的任意一点作为起点,开始向下走,直到走到最后一行。分析示例1,可以从1位置出发,走到5位置,最后沿着左斜对角位置走到7位置,也可以从1位置出发,沿着右斜对角线走到4位置,在沿着左斜对角线走到8位置,返回它们的最小值。

算法解析:

状态表示:(经验+题目要求)经验:以某一个位置为结尾,dp[i][j]表示:到达[i,j]位置时最小的下降路径。

状态转移方程:(根据最近一步划分问题)分情况讨论:1.从[i-1,j-1]到[i,j]位置-->dp[i-1][j-chu1]+m[i][j];2.从[i-1,j]到[i,j]位置-->dp[i-1][j]+m[i][j];3.从[i-1,j+1]到[i,j]-->dp[i-1,j+1]+m[i][j];综上所述,dp[i][j]-min(x,y,z)+m[i][j](x,y,z分别代表上述在不同情况下推导出来的状态转移方程);

初始化:(处理越界访问情况)策略:多加一行多加两列。(注意:里面的值要保证后面的填表时正确的;下标的映射)。

填表顺序:从上往下

返回值:最后一行dp表里面的最小值。

代码:

cpp 复制代码
class Solution {
	int jiuephferui(vector<vector<int>>& num) {
		int n = num.size();
		vector<vector<int>> dp(n + 1, vector<int>(n + 2,INT_MAX));
		for (int j = 0; j < n + 2; ++j) {
			dp[0][j] = 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])) + num[i - 1][j - 1];
			}
			
		} 
		int ret = INT_MAX;
		for (int j = 1; j <= n; ++j) ret = min(ret, dp[n][j]);
		return ret;
	}
};
相关推荐
曦樂~9 小时前
Cpp面筋
c语言·c++
道尔柯南9 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
Dream it possible!12 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
心抵鹊13 小时前
算法之双指针系列(一)
算法·leetcode
十二13 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
小此方14 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
Pniubi14 小时前
力扣560.和为k的子数组
算法·leetcode·职场和发展
D e re k ZH15 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
Pniubi15 小时前
力扣438.找到字符串中所有字母异位词
算法·leetcode·职场和发展
zjxtxdy16 小时前
C++面向对象程序开发-类与对象
开发语言·c++