簡體   English   中英

為遞歸函數實現DP

[英]implement DP for a recursive function

我具有以下遞歸函數:

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 s的問題。

制作一張桌子b / e並逐格填寫。 這是具有時空復雜度O(MaxB * MaxE)的DP。

使用Ante的注釋可以減少空間的復雜性-僅存儲兩個需要的行或列。

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

您可能想看看最近有關通用自動備忘的 博客文章 作者討論了各種數據結構,例如std::mapstd::unordered_map等。警告:使用大量模板代碼。

如果您想要一個自下而上的表示形式,那會很好。

如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]

您可以使用二維數組在O(n ^ 2)中實現(假定n為b和e的最大值)。 i,j的每個當前值將取決於i-1,j和i-1,j-1和i,j-1的值。 確保處理i = 0,j = 0的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM