25haozyq 2024-10-03 20:23 采纳率: 100%
浏览 18
已结题

给定一个 N 行 N 列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能 到达值为 0 的方格,求出一条到达右下角的最佳路径,所谓最佳路径是指途径的数的乘积的 末尾连续的 0 最少。

给定一个 N 行 N 列的非负整数方阵,从左上角(1,1)出发,只能向下或向右走,且不能
到达值为 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 数量)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月8日
  • 已采纳回答 11月30日
  • 创建了问题 10月3日