如何在四面体整数中找到最小路径的最大和?

时间:2015-07-08 02:12:01

标签: c++ algorithm sorting data-structures dijkstra

首先是问题,

假设一个整数可以表示为一个完美的球体,其中球体的值等于它包含的整数。球体被组织成四面体金字塔,其中N =边的长度,N在1和15之间。挑选(可能是空的)球体的子集,使得它们的值的总和最大化。请注意,球体可以保持负值,因此不一定需要拾取每个球体。我们不想破坏金字塔,因此我们不能在没有首先采用任何一个球体的情况下采取任何一个球体。

输入格式:

第1行:整数N

第2行:N(N + 1)/ 2 + 1

输出格式:

第1行:一个整数,可达到的最大值总和

示例输入:

3
5
-2 -7 
-3
1 0 8
0 3
2

示例输出:

8

以下是迄今为止我理解的示例解决方案:

最佳解决方案在下图中以粗体显示。拿1是不明智的,因为这需要-2,减少总数。应该采用8,3和2,因为它们超过-3和-7。

Sample Diagram of tetrahedron

我的问题是,

如何存储输入以便保留正确的顺序?或者我甚至需要?我正在尝试使用队列,但我的程序变得非常长,因为我必须找到每个可能路径的总和,然后比较每个总和以找到最大值。我也很难将数据分解成正确的模式,因此我不会重新计算一个数字或者不按顺序执行一个数字。有没有更有效的方法来做到这一点?在这种情况下,Dijkstra算法可以使用吗?如果是这样,那怎么样?任何帮助是极大的赞赏!!

1 个答案:

答案 0 :(得分:1)

我会使用三维数组。要使用您的示例:

A[0][0][0] = 5

A[1][0][0] = -2
A[1][1][0] = -3
A[1][0][1] = -7

A[2][0][0] = 1
A[2][1][0] = 0
A[2][2][0] = 2
A[2][0][0] = 0
A[2][1][0] = 3
A[2][0][0] = 8

“上述”关系只是指数算术的问题:[i a ,j a ,k a ]高于[ i a + 1,j a ,k a ],[i a +1,j a + 1,k a ]和[i a + 1,j a ,k a 1]。