总和为一的一半的权力

时间:2014-11-29 02:31:25

标签: algorithm dynamic-programming

调用每个亚神经比例,其分母的功率为2 a perplex。

1号可以用很多方式写成,作为困惑的总和。 enter image description here

将每一个困惑的人都称为zeta。 当且仅当zeta中的一个具有至少一个另一个不具有的复杂时,两个zetas是不同的。在上图所示的图像中,最后两个zetas被认为是相同的。

找出所有数量的方法1可以写成具有N个困惑的zeta。因为这个数字可能很大,所以计算模数为100003。

请不要发布代码,而是发布算法。尽可能精确。

这个问题是在比赛中提出的,用罗马尼亚语编写的官方解决方案已作为docx文件上传到https://www.dropbox.com/s/ulvp9of5b3bfgm0/1112_descr_P2_fractii2.docx?dl=0。 (你可以使用谷歌翻译) 我不明白解决方案的作者在那里说的是什么。

1 个答案:

答案 0 :(得分:0)

嗯,这让我想起了BFS算法(广度优先搜索),您可以从一个点向外辐射,找到具有不同排列的多个解决方案。

在这里你可以使用递归,并设置基本情况,就像在递归函数的1个调用堆栈中达到N个困惑时一样。

所以你可以说:

function(int N <-- perplexes, ArrayList<Double> currentNumbers, double dividedNum)
if N == 0, then you're done - enter the currentNumbers array into a hashtable
clone the currentNumbers ArrayList as cloneNumbers
remove dividedNum from cloneNumbers and add 2 dividedNum/2
iterate through index of cloneNumbers
    for every number x in cloneNumbers, call function(N--, cloneNumbers, x)

这是一个粗略,非常低效但很简单的方法。显然有很多方法可以修剪算法(减少进入哈希表的重复数量,尽可能地防止克隆等),但是因为这显示了每个数字的绝对排列,然后进入将该序列放入哈希表中,哈希表将使用其equals()比较来查看序列是否已存在(例如最后2个zetas),并拒绝重复。这样,你就可以得到你想要的答案。

当前算法的效率:O(| E | ^(N)),其中| E |是所有插入结束时数组内部可以拥有的绝对数字,N是插入的数量(或者正如您所说的,#perplexes)。显然,这不是最佳速度,但确实有效。

希望这有帮助!