我有一个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();
}
但不知道如何遍历矩阵,获取所有不同的路径或找到他们要求的值。我一直在谷歌搜索动态编程和其他东西几天没有任何结果。
提前感谢您的帮助。
答案 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)
中运行,即:
alts
的所有值存储在单独的数组中并对其进行排序现在,对于此数组(L,H)
的值的所有对L <= H
,alts
:
B
,b(i,j) = 1
如果L <= a(i,j) <= H
,则b(i,j) = 0
。BFS
或union-find结构来查找B中最大的1值连通分量的大小。您现在知道每对(L,H)
,k(L,H)
,L
和H
之间值的最大连通分量的大小。现在,要找到给定k
的最低高度差异,您只需计算所有对H-L
的{{1}}的最小值(L,H)
。
k(L,H) >= k
的变体:对于任何给定O((RC)^2 log(RC))
,对于k
(最低点)的所有可能值,对L
(最高点的值)进行二分搜索以找到最低值H
,H
。这是可能的,因为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
,从而回答所有问题(您可以存储{的所有最小k
在H-L
大小的数组中从k
到0
的{1}}。