以下算法是否确实找到了对特定和进行更改的所有可能方法?是否真的使用了memoization?
func count( n, m )
for i from 0 to n
for j from 0 to m
if i equals 0
table[i,j] = 1
else if j equals 0
table [i,j] = 0
else if S_j greater than i
table[ i, j ] = table[ i, j - 1 ]
else
table[ i, j ] = table[ i - S_j, j ] + table[ i, j - 1 ]
return table[ n, m ]
每次调用函数计数时,它都会从头开始填充表。即使表已经针对某些值进行了初始化,下次调用计数时,它也不会使用这些值,而是会从i = 0和j = 0再次开始。
答案 0 :(得分:1)
这不是Memoization。这是动态编程代码的一个示例。
为了分析您的代码,首先我们需要区分Memoization和Dynamic Programming。
Memoization是一种自上而下的方法,动态编程是一种自下而上的方法。
考虑找到数字
如果你找到了n!通过使用以下事实,
n! = n * (n-1)! and 0!=1
这是自上而下方法的一个例子。
n的值保留在内存中,直到值为0!到(n-1)!被退回。缺点是你浪费了大量的堆栈内存。优点是,如果子问题已经解决,则不必重新计算子问题。子问题的解决方案存储在内存中。
但是在你的问题中,你没有自上而下的方法,因此没有记忆。
表中的每个条目都是直接从先前计算的子问题解决方案中获得的。因为它使用自下而上的方法。因此,您有一段使用动态编程的代码。