使用dp

时间:2019-05-22 11:09:16

标签: algorithm dynamic-programming

问题:

给定n个数字,...,考虑对所有<=计算[,] = ++⋯的问题。通过独立计算每个[,]的幼稚算法将花费(^)时间。得出一种在(^)时间内解决此问题的有效方法。

我试图绘制一个二维表,其中行和列均为1〜n,并找到一些公式来填充所有表(上三角)。但是我认为每个块都是不规则的,也许这不是一个好主意。有什么主意吗谢谢。

2 个答案:

答案 0 :(得分:2)

是的,您使用2维表(仅上部三角形)的想法是正确的。 然后,您只需注意:

enter image description here

那个

enter image description here

因此,表的每个输入都将在O(1)中进行计算,整个上三角将在O(n ^ 2)中进行计算

答案 1 :(得分:0)

虽然不需要O(n ^ 2)内存。您可以使用所谓的前缀和。创建一个数组'prefsum [n]',对于(1 ... n)中的每个i,prefsum [i] = x1 + x2 + ... + xi。如果要获得范围(l,r)中的和,只需取prefsum [r]-prefsum [1-1](显然,如果l-1> 0,否则结果是prefsum [r])。这样,您可以在O(n)(循环简单)中计算prefsum,并获得O(1)中任意范围的结果。由于存在O(n ^ 2)个不同的范围,因此您的复杂度为O(n ^ 2)。