给定一个 N 行 N 列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能
到达值为 0 的方格,求出一条到达右下角的最佳路径,所谓最佳路径是指途径的数的乘积的
末尾连续的 0 最少。
给定一个 N 行 N 列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能 到达值为 0 的方格,求出一条到达右下角的最佳路径,所谓最佳路径是指途径的数的乘积的 末尾连续的 0 最少。
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
一轮明月照丘壑 2024-10-03 20:24关注以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
这个问题可以通过动态规划来解决。我们可以定义一个二维数组
dp来记录到达每个位置的最小末尾连续的 0 数量。对于每个位置(i, j),我们可以从(i-1, j)或(i, j-1)到达这个位置。因此,我们需要找到从(i-1, j)和(i, j-1)到达(i, j)的路径中末尾连续的 0 最少的路径。具体做法如下:首先初始化
dp数组为矩阵的最大值(因为末尾连续的 0 数量肯定不会超过矩阵中的最大值),然后遍历整个矩阵,对于每个位置(i, j),如果当前位置的值不为 0,则更新dp[i][j]为dp[i-1][j]和dp[i][j-1]中的较小值加上当前位置的值(如果当前位置的值末尾有连续的 0,则这个值会使得末尾连续的 0 数量增加)。最后返回dp[N-1][N-1]即可得到到达右下角的最小末尾连续的 0 数量。以下是相应的 C++ 代码实现:
#include <iostream> #include <vector> #include <algorithm> // for min function using namespace std; int minTrailingZeroes(vector<vector<int>>& matrix) { int N = matrix.size(); // 获取矩阵的行数和列数 vector<vector<int>> dp(N, vector<int>(N, INT_MAX)); // 创建动态规划数组并初始化为最大值 dp[0][0] = matrix[0][0]; // 开始位置的值即为路径末尾连续的 0 数量 for (int i = 1; i < N; ++i) { // 从第一行开始遍历矩阵每一行和每一列 dp[i][0] = dp[i - 1][0] + matrix[i][0]; // 更新第一列的路径末尾连续的 0 数量 for (int j = 1; j < N; ++j) { // 从第一列开始遍历矩阵每一列和每一行 if (matrix[i][j] != 0) { // 当前位置不为 0 时进行状态转移 // 寻找从上方的`(i-1, j)`到达`(i, j)`或者从左方的`(i, j-1)`到达`(i, j)`的路径中末尾连续的 0 最少的路径加上当前位置的值即为新的状态值 dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + matrix[i][j]; // 更新状态转移方程 } else { // 当前位置为 0 时,无法继续走,将路径末尾连续的 0 数量设为最大值加 1 表示不可达状态或无法继续累加末尾连续的 0 数量(取决于具体需求) dp[i][j] = INT_MAX + 1; // 设置不可达状态或无法累加末尾连续的 0 数量(可选) } } } return dp[N - 1][N - 1]; // 返回右下角位置的最小末尾连续的 0 数量 }请注意,这个代码假设输入的矩阵大小是合法的,并且矩阵中的元素都是非负整数。此外,代码中的
INT_MAX是用来表示无穷大的值,假设使用的是一个标准的 C++ 环境。此外根据实际需求调整处理当遇到值为 0 的方格时的处理方式(设置为不可达状态或无法累加末尾连续的 0 数量)。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报