C ++向量和memoization运行时错误问题

时间:2012-01-27 06:50:55

标签: c++ recursion vector runtime-error memoization

我在Codechef遇到了问题here。我正在尝试使用矢量进行记忆。由于我还是编程新手并且对STL容器不熟悉,我使用vector作为查找表。 (尽管我曾建议使用map帮助解决问题)。

所以,我的问题是下面给出的解决方案如何运行到运行时错误。为了得到错误,我使用问题的边界值(100000000)作为输入。我的Netbeans IDE显示的错误消息为RUN FAILED (exit value 1, total time: 4s),输入为1000000000。这是代码:

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string>

#define LCM 12
#define MAXSIZE 100000000
using namespace std;
/*
 * 
 */
vector<unsigned long> lookup(MAXSIZE,0);

int solve(int n)
{
    if ( n < 12) {
        return n;
    }
    else {
        if (n < MAXSIZE)  {
            if (lookup[n] != 0) {
                return lookup[n];
            }
        }

            int temp = solve(n/2)+solve(n/3)+solve(n/4);
            if (temp >= lookup[n] ) {
                lookup[n] = temp;
            }
            return lookup[n];

    }
}
int main(int argc, char** argv) {
    int t;
    cin>>t;
    int n;
    n = solve(t);
    if ( t >= n) {
        cout<<t<<endl;
    }
    else {
        cout<<n<<endl;
    }
    return 0;
}

3 个答案:

答案 0 :(得分:3)

我怀疑这是否是一个内存问题,因为他已经说过该程序实际运行并输入了100000000。

我注意到的一件事情,即使n == MAXSIZE(在这种情况下),在if条件下你正在进行查找[n]。由于C ++使用0索引向量,因此这将超出向量的末尾。

    if (n < MAXSIZE)  {
     ...
    }

        ...
        if (temp >= lookup[n] ) {
            lookup[n] = temp;
        }
        return lookup[n];

我无法猜测算法在做什么,但我认为第一个“if”的右括号应该更低,你可以在这个边界条件下返回错误。

答案 1 :(得分:2)

您要么没有足够的内存,要么没有足够的连续地址空间来存储100,000,000 unsigned long秒。

答案 2 :(得分:0)

这主要是内存问题。对于向量,您需要连续的内存分配[以便它能够跟上其对常量时间查找的承诺]。在你的情况下,使用8字节双,你基本上要求你的机器在一个块中为你提供大约762 MB的内存。

我不知道你正在解决哪个问题,但看起来你正在解决Bytelandian硬币问题。为此,使用地图要好得多,因为:

  1. 在测试用例运行中,您几乎不会存储所有100000000个案例的值。因此,您需要的是一种仅为那些实际记忆的值分配内存的方法。
  2. 即使你是,你也不需要经常查询。虽然它会加速你的程序,但std :: map使用树来给你对数查找时间。它消除了连续使用762 mb的要求。 762 MB并不是什么大不了的事,但是在单个区块中期待的是。
  3. 因此,在您的情况下使用的最好的事情是std :: map。在您的情况下,实际上只需将std::vector<unsigned long>替换为std::map<int, unsigned long>map也可以[]操作员访问[大部分,它应该]。