动态编程算法的时间总是O(P),其中P是子问题的数量。
以上命题是否正确?或者有一个反例?
答案 0 :(得分:1)
不幸的是,你的命题太简单了。如果P是子问题的数量,那么,根据具体情况,你可能只需要解决其中的一小部分就可以推导出DP(N)。或者,也许你需要解决所有这些问题,但是将它们组合起来产生DP(N)会花费O(P)时间本身,所以运行时实际上是O(P ^ 2)。
第一种情况的一个例子可能是重复的平方法。为了找出59 ^ 1000000 mod 123981238,你可以一次找出59 ^ 1,59 ^ 2等,最终达到59 ^ 1000000。或者,通过重复平方,您只关心一小部分子问题并获得更快的算法。
第二种情况的一个例子是来自how to improve this code?的问题。 总结一下这个问题:给定一个整数N,我们希望找到总和为N的最短正方形列表。例如,对于N = 1000,我们想要30 ^ 2 + 10 ^ 2。对于N = 3,1 ^ 2 + 1 ^ 2 + 1 ^ 2。如果你认为1 ... N-1是'子问题',那么通过迭代小于N的平方,需要O(sqrt(N))时间来得到N的答案。这样,只有O(N)子问题,但是在每个时间点将它们组合起来需要O(sqrt(N)),因此总运行时间为O(Nsqrt(N))。