Marathon24比赛评分:DNA -TLE

时间:2013-10-22 17:41:43

标签: algorithm

我正在重新尝试这个problem statementnow that the contest is all over(所以这不是作弊或任何事情,只是想学习,因为答案没有公布,只有给定测试用例的正确输出输入文件)。

有10个给定的测试用例输入,要为其提交相关的输出文件。我原来的提交是一个天真的嵌套for循环(开始,结束)对的实现,回答查询:什么是从(从0开始)索引start开始的子字符串的波动率度量,结束于{ {1}}(包括)。

显然,对于10 6 的最大问题限制,O(N 2 )是不可行的,所以我只得到5/10测试用例正确(第一个 - 更简单 - 当然是5个。

因此,我正在写这里寻求关于如何改进我的算法的人群情报,即我怀疑嵌套for循环(开始,结束)是优化的主要瓶颈(当然!)所以到目前为止,我已经尝试将其作为字符串/子串问题的动态编程(DP),但在提出状态表示和转换位时没有任何成功,以便可以实现DP。

为方便参考,并表明这不是作业,而且我诚实地尝试过,我的原始提交内容可用here

任何帮助都非常感谢,甚至链接到类似的问题,我可以谷歌的教程博客文章/样本解决方案/赛后编辑分析。

1 个答案:

答案 0 :(得分:0)

你有没有尝试过分而治之?

如果我正确地理解了问题,给定长度为n的DNA链S,我们将S分成两半,S_left和S_right,其中S_left由S [i]组成,其中0 <= i <1。 n / 2,S_right由S [j]组成,其中(n / 2)+1&lt; = j&lt; ñ。最易变的片段或者完全在S_left内,完全在S_right内,或者跨越S_left和S_right的边界。

要查找S_left和S_right中最易变的片段,我们只使用递归。棘手的一点是找到跨越S_left和S_right边界的片段的波动率度量。这里有一个正整数分数的数学性质:给定四个正(非零)整数a,b,c和d,(a + c)/(b + d)绝不大于两者(a / b)和(c / d)。这里 a b 是从边界开始的S_left中嘌呤和嘧啶的累积计数,而 c d 是S_right中从边界开始的嘌呤和嘧啶的累积计数。这个数学性质意味着我们不需要检查超过a = 0或c = 0的交叉片段的波动率度量,因为它保证小于S_left或S_right的最大波动率。这种搜索的时间复杂度可以在O(n)中用于交叉片段,而O(n lg n)用于整个算法。

希望这可行,因为我没有编码算法。也许它有一个针对这个问题的O(n)时间DP算法,但这就是我现在所拥有的。