【问题标题】:Path with maximum average value具有最大平均值的路径
【发布时间】:2021-08-09 05:19:51
【问题描述】:
import java.util.Scanner;

public class maxAvgPath {
    public static void main(String [] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] c = new int[n+1][n+1];
        for (int i = 0; i < n; i++){
            for (int j = 0; j < n; j++){
                c[i][j]=sc.nextInt();
        }
    }
   float sum = c[0][0];
   float m = 0;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
                if (c[i][j + 1] < c[i + 1][j]) {
                    sum = sum + c[i + 1][j];
                    m++;
                    

                } else {
                    sum = sum + c[i][j + 1];
                    m++;
                    
                }
        }
    }

    System.out.println((sum/m));
}
}

给定一个大小为 N*N 的方阵,其中每个单元格都与特定的成本相关联。路径定义为从左上角单元格开始仅向右或向下移动并在右下角单元格结束的特定单元格序列。我们希望找到一条在所有现有路径上具有最大平均值的路径。平均值计算为总成本除以路径中访问的单元格数量。 输入:矩阵 = [1, 2, 3, 4, 5, 6, 7、8、9] 输出:5.8 具有最大平均值的路径是 1 -> 4 -> 7 -> 8 -> 9 路径总和为 29,平均值为 29/5 = 5.8

但是我没有得到正确的输出,有人能告诉我我的错误在哪里吗?

【问题讨论】:

  • 谁是“我们”?你的 for 是否重新表述了你的作业?
  • 这是什么意思?

标签: java matrix


【解决方案1】:

您的 m 应始终为 2 * n - 1。无论选择何种路径,您总是会从左上角开始向右或向下移动。你有 n - 1 行和 n - 1 列,所以你正好向右移动 n - 1 次,向下移动正好 n - 1 次。总的来说,计算左上角,你的理想路径上有 1 + (n - 1) + (n - 1) 个数字。因此,您不是在寻找最大平均值,而是在寻找最大总和。

您的循环与您尝试执行的操作不完全同步。假设对于给定的矩阵,当i = 0, j is 0 时,您发现 4 大于 2。您选择 4,m[1][0],然后您应该检查 m[1][1] 和 m[ 的最大值2][0] ...但您的循环移动到... i = 0, j = 1,允许您检查 m[1][2] 和 m[1][1]。

您还使用了贪婪的方法,它不会总是给您最好的结果,例如[1 2 9, 3 4 9, 5 2 9],您的算法将选择 1,向下移动到 3 和 5,然后向右移动到 2 和 9,总共 20。但是,理想的路径是 1,向右移动2 和 9,然后下降到 9 和 9,总共 30。

解决此问题的一种方法是保持循环,但不是保持一个总和,而是需要跟踪多个总和并在每一步选择一个最大值。

例如对于 [1 2 9, 3 4 9, 5 2 9],您使用 0 初始化求和矩阵并开始导航。

对于 sum[0][0],只有一个可能的和,即取 m[0][0]。这将持续到整个第一行,因此您的求和矩阵现在是 [1 3 12, 0 0 0, 0 0 0]。对于 sum[1][0],也只有一个可能的和,从 m[0][0] 向下移动,所以 sum[1][0] 是 m[0][0] + m[1][ 0]。乐趣从这里开始。

对于 sum[1][1],您需要在 sum[0][1] 和 sum[1][0] 之间进行选择并添加 m[1][1]。您当然会选择 sum[1][0](实际上是 m[0][0] + m[1][0])并将 m[1][1] 添加到其中,所以 sum[1][ 1] 是 8。因此,如果你的最大路径曾经到达 r1c1,你就知道你已经选择了迄今为止的最大可能总和。

我还将重点介绍下一步 sum[1][2],您必须在 sum[0][2] 和 sum[1][1] 之间进行选择并添加 m[1][2]。我们知道 sum[0][2] 是 12,sum[1][1] 是 8,所以,如果我们的路径到达单元格 r1c2,我们知道我们需要完全选择第一行然后向下移动(m[ 0][0], m[0][1], m[0][2], m[1][2]) 向下移动并选择下一行 (m[0][0], m[1] ][0], m[1][1], m[1][2]),所以你当前在 sum[1][2] 中的最大和是 21,你的和矩阵是 [1 3 12, 4 8 21 , 0 0 0]。

最后一行是一样的:

sum[2][0] = sum[1][0] + m[2][0]
sum[2][1] = max(sum[1][1], sum[2][0]) + m[2][1]
sum[2][2] = max(sum[1][2], sum[2][1]) + m[2][2]

您的求和矩阵最终变为 [ 1 3 12, 4 8 21, 9 11 30 ],因此您的 最大值为 30。您已选取 2 * 3 - 1 = 5 个数字,因此您的平均值为 6。

说明求和矩阵也很有趣:

1  3 12
4  8 21
9 11 30

如果您想确定您选择的从左上角到右下角的路径是什么,您只需要按降序计算总和(记住右移或下移规则), 30 -> 21 -> 12 -> 3 -> 1.

我将把编码部分留作练习,你有你需要的所有细节。

(抱歉格式错误和长文本)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多