最大子总和

时间:2015-11-04 06:28:37

标签: java algorithm dynamic-programming

以下是我输入数据的示例:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <ul class="selector"></ul>

输出是:
5 // Number of 1D arrays, in this case we'll have array[5][3] 1 2 3 // Values of array[i][0..2] 1 1 1 1 0 0 1 1 0 2 1 0

问题是使用12 // Maximum sum ({1 2 3} + {1 1 1} + {2 1 0} = {4 4 4} = 12) - END SUM VALUES MUST BE EQUAL(4 4 4). 3 // Number of arrays used to get this sum数组找到最大总和,而secod条件是使用最少数量的数组。如果n我们停止算法。 (300是最大值)。这是我的代码,我得到了很好的答案,但它的时间复杂度是O(2 ^ n-1)。我认为以某种方式保存结果并且不能多次计算相同的事情是可能的,但我还不知道如何。

sum > 300

2 个答案:

答案 0 :(得分:1)

这可能不是解决此问题的最佳算法,但它应该比O(2 ^ N)更快。

这个想法是在循环输入数组时记录所有可达总和。你可以使用一个字典,其密钥是可能总和的唯一散列,为了简单起见,我们假设密钥是一个连接三个总和的字符串,例如,总和[3,5,4] ]我们将使用密钥&#34; 003005004&#34; ,字典的值将是达到该总和的最小数组数。

所以在你的情况下:

1 2 3 => [001002003] =1
1 1 1 => [001001001] =1, [002003004]=2  (itself and use [001002003] from above)
1 0 0 => [001000000] =1, [002002003] =2, [002001001] =2, [003003004] =3
1 1 0 ...
2 1 0 ...

最后,您会发现[004004004] = 3,这是您的答案。

这看起来似乎也经历了所有组合,所以为什么它更快,因为每个数字的最大总和是300,所以在最坏的情况下,我们可能有301 ^ 3个键已填充并必须更新每个新输入数组的值。然而,这仍然是O(n),尽管有很大的常数,它仍然应该比O(2 ^ n)运行得快得多。 (如果求解300 ^ 3 * n = 2 ^ n,n约为30-ish)

简单的散列函数是* 301 * 301 + b * 301 + c

答案 1 :(得分:0)

我认为问题是iframe 1-D数组和数字m,使用n中的n数组找到最大总和;

解决方案看起来很直接。将每个1-D数组的总和保存在一个单独的数组中,比如说m

sum[]

对此数组1 2 3 = 6 1 1 1 = 3 1 0 0 = 1 1 1 0 = 2 2 1 0 = 3

进行排序
sum

并返回此数组的第一个6,3,3,2,1 元素的总和。