LeetCode: Minimum Falling Path Sum
Posted 卡尔曼和玻尔兹曼谁曼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode: Minimum Falling Path Sum相关的知识,希望对你有一定的参考价值。
文章目录
Minimum Falling Path Sum
题目描述
本题目链接:931. Minimum Falling Path Sum
Given a square array of integers A
, we want the minimum sum of a falling paththrough A
.
A falling path starts at any element in the first row, and chooses one element from each row. The next row’s choice must be in a column that is different from the previous row’s column by at most one.
题目的意思是在一个给定的二维方格中,从上往下走。列方向每次只走一步,行方向上最多只能跨越一个单元格。即就是只能向正下方,左下方,右下方行进。每个方格都有一个值,目标是走到最后一行的路径中包含的值之和最小。
问题分析
还是使用动态规划,而动态规划的重中之重就是建立递推关系。
显然,对于第一行,我们选择最小的数进行开始;
然后,对于后面的,我们每次只要选择正下方,左下方,右下方中最小的数即可。
递推公式为:dp[i][j] = dp[i-1][j] + min(A[i][j-1], A[i][j], A[i][j+1])
(注意对数组越界的处理)
C++实现
使用A
当做dp
数组,这样可以节省空间,但是我觉得对输入参数直接进行了修改,这样不是很好。
class Solution
public:
int minFallingPathSum(vector<vector<int>> &A)
for (auto i = 1; i < A.size(); ++i)
for (auto j = 0; j < A.size(); ++j)
A[i][j] +=
min(A[i - 1][max(0, j - 1)],
A[i - 1][j],
A[i - 1][min(static_cast<int>(A.size() - 1), j + 1)]);
return *min_element(A.back().begin(), A.back().end());
;
Scala实现
Scala版本的对输入参数A
保持不变,但是这仍然不是纯函数的实现。如果有朋友有纯函数实现的方案,请不吝赐教!
object Solution
def minFallingPathSum(A: Array[Array[Int]]): Int =
val dp = A.clone()
for (i <- 1 until dp.length; j <- dp.indices)
dp(i)(j) += List(
dp(i - 1)(math.max(0, j - 1)),
dp(i - 1)(j),
dp(i - 1)(math.min(dp.length - 1, j + 1))).min
dp.last.min
以上是关于LeetCode: Minimum Falling Path Sum的主要内容,如果未能解决你的问题,请参考以下文章
leetcode1289. Minimum Falling Path Sum II
108th LeetCode Weekly Contest Minimum Falling Path Sum