为递归函数实现 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
。
制作一个表格 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]
你可能想看看最近这篇关于通用自动记忆的博客文章。作者讨论了各种数据结构,如std::map
、std::unordered_map
等。警告:使用模板密集型代码。
您可以使用二维数组在 O(n^2) 中实现(假设 n 作为 b 和 e 的最大值数)。i,j 的每个当前值将取决于 i-1,j 和 i-1,j-1 和 i,j-1 处的值。确保处理 i=0, j=0 的情况。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 实现伪多项式DP子集和
- 为递归函数实现 DP