如何重置函数内部的静态向量

How to reset a static vector inside a function?

本文关键字:静态 向量 内部 何重置 函数      更新时间:2023-10-16

我正在尝试使用动态规划范式解决在线裁判上的某个问题。我已经写了一个函数,它可以记住较小的子问题的结果。但是这个函数在一次运行中将被调用t次。因此,当函数调用自身时,我希望保留其"内存",但是当它从驱动程序调用时,我不希望向量被重置。我怎么做呢?我认为有一个全局向量并在每次来自驱动程序的调用后重置它是可能的,但正如我从书籍和堆栈溢出中学到的,这是"糟糕的编程风格"。那么解决这个问题的好办法是什么呢?下面是代码:

class mem{
public:    
        bool mike_win;
    bool written;
};
bool calc(int a){
    static vector<mem> memory(a);
    if( a == 1){
            return false;
    }
    if(memory[a-1].written == true){
        return (!(memory[a-1].mike_win))
    }
    vector<int> div_list = divis(a);
        //^^ divis is a function which takes a number and returns 
        //all its divisors in descending order in a vector<int>
    for(vector<int>::iterator i = div_list.begin();i != div_list.end();i++){
        if ( ! ( calc( a / (*i) ))){
            memory[a-1].written = true;
            memory[a-1].mike_win = true;
            return true;
        }
    }
    if(calc(a-1 ) == false){
        memory[a-1].written = true;
        memory[a-1].mike_win = true;
        return true;
    }
    else{
        memory[a-1].written = false;
        memory[a-1].mike_win = false;
        return false;
    }
}

这是问题的链接。这里是函数div

vector<int> divis(int a){
    vector<int> div_list(int a )
        if(a==2){
                return div_list;
        }
        int k = sqrt(a);
        for(int i=2;i<=k;i++){
            if(!(a%i)){
                    div_list.push_back(i);
                    div_list.push_back(a/i);
            }
        }
        sort(div_list.rbegin(),div_list.rend());
        div_list.erase(unique(div_list.begin(),div_list.end()),div_list.end());
        return div_list;
}

我认为我这样做的方式是创建calc的两个过载:一个只需要int作为参数,另一个需要int和对vector<int>的引用。这样,用户将调用第一个重载,它将创建用于记忆的临时向量,并将其传递给第二个函数,后者将递归传递引用。像这样:

bool calc(int a, vector<int>& memory)
{
    // Do your stuff here
    // Instead of calling it as calc( a / (*i) ), just call
    // it as calc( a / (*i) , memory )
}
bool calc(int a)
{
    vector<int> memory(a);
    calc(a, memory);
}

这样,你就不必在算法的中心做任何簿记工作来决定是否清除向量;它将在第一个调用返回后自动完成。