矩阵中x长度的任何路径中最大值和最小值之间的最小差异

时间:2017-06-08 12:17:02

标签: java algorithm matrix path traversal

我有一个kattis任务,我正在努力完成。 任务是在矩阵中找到一组至少k个连通的条目,以便最小化集合中最大和最小条目之间的差异"。

输入首先是矩阵的大小:

5 10

然后是矩阵的值:

0  0  3  46 0  46 0  0  12 12

0  0  13 50 49 46 11 10 10 11

0  51 51 49 99 99 89 0  0  10

0  0  48 82 70 99 0  52 13 14

51 50 50 51 70 35 70 10 14 11

之后有k值的数量:

 6 

然后是k上的实际值:

1

5

10

12

47

50 

该任务表明:"矩阵中的条目a(i,j)与条目a(i,j + 1),a(i + 1,j),a(a)相邻i,j-1)和a(i-1,j)。如果对于集合中的每对条目,则连接一组条目,其中存在相邻条目的连接路径。"。

对于给定的值,输出应为:

0

0

3

4

89

99

我已经编写了代码来接受所有输入:

  Scanner sc = new Scanner(System.in);
  int r = sc.nextInt();
  int c = sc.nextInt();

  // fill with values
  int[][] dimMat = new int[r][c];
  for (int i = 0; i < dimMat.length; i++) {
     for (int j = 0; j < dimMat[i].length; j++) {
        dimMat[i][j] = sc.nextInt();
     }
  }

  int n = sc.nextInt();
  int[] myK = new int[n];

  // fill k
  for(int k= 0; k< myK.length; k++){
     myK[k] = sc.nextInt();
  }

但不知道如何遍历矩阵,获取所有不同的路径或找到他们要求的值。我一直在谷歌搜索动态编程和其他东西几天没有任何结果。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我或许可以帮助你入门。解决这些问题的一个好方法是首先提出一个天真的解决方案,然后进行优化。解决此问题的一种天真的方法可能如下所示:

k = desired size of region;
minValue = infinity;
for every node in your graph {
  S = an empty set of nodes;
  add current node to s;
  while(S.size < k) {
    nextNode = infinity;
    for every node in S called s {
      N = the smallest connected node to s;
      if N < nextNode
        nextNode = n;
    }
    add nextNode to S;
  }
  find greatest difference between nodes in your set;
  if greatestDifference < minValue
    minValue = greatestDifference;
}

此算法循环遍历图中的每个节点,构建距该节点最小距离的区域,查看这些节点之间的最大距离当前是否为全局最优,如果是,则存储最大距离。您可以使用此伪代码,键入它,然后对其进行优化。我希望这对你来说已经足够了。这个算法很不优化。

答案 1 :(得分:0)

O((RC)^3)中的第一个算法:

考虑到矩阵的小尺寸,您可能会采用一种非常天真的方法,该方法在O((RC)^3)中运行,即:

  1. 将高度alts的所有值存储在单独的数组中并对其进行排序
  2. 现在,对于此数组(L,H)的值的所有对L <= Halts

    1. 考虑矩阵Bb(i,j) = 1如果L <= a(i,j) <= H,则b(i,j) = 0
    2. 使用多个BFS或union-find结构来查找B中最大的1值连通分量的大小。
    3. 您现在知道每对(L,H)k(L,H)LH之间值的最大连通分量的大小。现在,要找到给定k的最低高度差异,您只需计算所有对H-L的{​​{1}}的最小值(L,H)

      每个请求k(L,H) >= k的变体:

      对于任何给定O((RC)^2 log(RC)),对于k(最低点)的所有可能值,对L(最高点的值)进行二分搜索以找到最低值HH。这是可能的,因为k(L,H) >= k对所有H1 >= H2隐含k(L,H1) >= k(L,H2)

      最后,L

      中的解决方案

      对于矩阵的所有点,启动Dijkstra搜索(优先级是高度,并且您永远不会到达高于起始高度的点)。每次搜索背后的假设是你从高峰开始搜索,只从那里开始,慢慢增加高度差。

      和以前一样,在此计算过程中,您会获得给定O((RC)^2 log(RC))的已连接组件,其中您知道其大小为(L,H)。这允许您计算实现所有k(L,H)的给定H-L的最低差异k,从而回答所有问题(您可以存储{的所有最小kH-L大小的数组中从k0的{​​1}}。