c++ - 如何重置函数内的静态 vector ?

标签 c++ vector static dynamic-programming memoization

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

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;
    }

}

这里是 question. 的链接这是函数 divis :

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> 的引用。这样,用户将调用第一个重载,该重载将创建用于内存的临时 vector ,并将其传递给第二个函数,该函数在递归时传递引用。有点像这样:

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);
}

这样,您就不必在算法的核心进行任何类型的簿记来确定是否清除 vector ;它将在第一次调用返回后自动完成。

关于c++ - 如何重置函数内的静态 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24100445/

相关文章:

c++ - 为什么大小为零字节的分配成功?

c++ - 如何判断一个 vector 是否有一定数量的元素C++

c++ - 访问匿名命名空间内的变量 (c++)

c++ - 如何让 Rakefile 自动重建依赖文件?

c++ - C++ 类上的 std::move 不会 move 所有成员?

java - 如何同时修改 Vector

java - 无法使用 JMockit 模拟静态方法

java - 最终变量赋值 : at declaration or in constructor?

c++ - 为什么 std::vector 需要 is_trivial 来进行按位移动,而不仅仅是 is_trivially_copyable ?

python - 使用 Python 对 2 个数组中包含的向量进行元素级叉积