C++ 这个C++;功能使用记忆? #包括 std::向量as; 长整型(尺寸){ 如果(n==1)返回1; 如果(n==2)返回-2; if(as.size()

C++ 这个C++;功能使用记忆? #包括 std::向量as; 长整型(尺寸){ 如果(n==1)返回1; 如果(n==2)返回-2; if(as.size(),c++,dynamic-programming,memoization,C++,Dynamic Programming,Memoization,if(as[n]如果公式可以产生正值和负值,则此函数有一个严重的错误。检查if(as[n]代码似乎没有正确检查is(as[n]发布的代码只记录了大约40%的时间(准确地说,当记忆的值为正值时)。正如Chris Jester Young指出的那样,正确的实现应该检查是否(As[n]==0)。或者,可以将记忆代码本身更改为As[n]=mod(-4*a(n-1)-4*a(n-2),65535); (当记忆值为0时,即使是==0检查也会花费精力。幸运的是,在您的情况下,这种情况从未发生过!)此代码中有一

if(as[n]如果公式可以产生正值和负值,则此函数有一个严重的错误。检查
if(as[n]代码似乎没有正确检查is(as[n]发布的代码只记录了大约40%的时间(准确地说,当记忆的值为正值时)。正如Chris Jester Young指出的那样,正确的实现应该检查
是否(As[n]==0)
。或者,可以将记忆代码本身更改为
As[n]=mod(-4*a(n-1)-4*a(n-2),65535);


(当记忆值为0时,即使是
==0
检查也会花费精力。幸运的是,在您的情况下,这种情况从未发生过!)

此代码中有一个错误。它将继续重新计算as[n]的as[n]值,而as[n]我认为当检查为as[n]时,仍然需要指数时间
#include <vector>
std::vector<long int> as;

long int a(size_t n){
  if(n==1) return 1;
  if(n==2) return -2;
  if(as.size()<n+1)
    as.resize(n+1);
  if(as[n]<=0)
  {
    as[n]=-4*a(n-1)-4*a(n-2);
  }
  return mod(as[n], 65535);
}