为递归函数实现DP

时间:2012-07-03 07:11:48

标签: c++ c algorithm dynamic-programming memoization

我有以下递归函数:

typedef unsigned long long ull;

ull calc(ull b, ull e)
{
  if (!b) return e;
  if (!e) return b;
  return calc(b - 1, e - 1) + calc(b - 1, e) - calc(b, e - 1);
}

我想用动态编程(即使用存储)来实现它。我曾尝试使用map<pair<ull, ull>, ull>但它也太慢了。我也无法使用数组O(1)来实现它。

我想找到一个解决方案,以便此函数可以快速解决大b, e个问题。

4 个答案:

答案 0 :(得分:5)

制作一张表b / e并逐个单元填写。这是具有空间和时间复杂度O(MaxB * MaxE)的DP。

Ante在评论中的建议可能会减少空间复杂性 - 只存储两个所需的行或列。

0 1 2 3 4 5
1 0 3 . . .
2 . . . . .
3 . . . . .
4 . . . . .

答案 1 :(得分:2)

您可能希望在通用自动blog posting上查看最近的memoization。作者讨论了各种数据结构,例如std::mapstd::unordered_map等。警告:使用模板密码。

答案 2 :(得分:2)

如果您想要自下而上的表示,那么这样做会很好。

在MBo显示

时填写表格

这可以这样做:

for e from 0 to n:
  DP[0][e] = e
for b from 0 to n:
  DP[b][0] = b
for i from 1 to n:
   for j from 1 to n:
      DP[i][j] = DP[i-1][j-1] + DP[i-1][j] - DP[i][j-1]

现在你对任何b,e的答案就是DP [b] [e]

答案 3 :(得分:1)

您可以使用二维数组在O(n ^ 2)中实现(假设n为b和e的最大值)。 i,j的每个当前值将取决于i-1,j和i-1,j-1和i,j-1处的值。确保处理i = 0,j = 0的情况。