[英]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 . . . . .
如果您想要一個自下而上的表示形式,那會很好。
如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.