如何重置函数内部的静态向量
How to reset a static vector inside a function?
我正在尝试使用动态规划范式解决在线裁判上的某个问题。我已经写了一个函数,它可以记住较小的子问题的结果。但是这个函数在一次运行中将被调用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);
}
这样,你就不必在算法的中心做任何簿记工作来决定是否清除向量;它将在第一个调用返回后自动完成。
相关文章:
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何从静态向量访问类元素?
- 如何将对象添加到类中的静态向量
- 使用 C++98 标准填充二维静态向量
- C++ 入门 12.1:我可以在类中使用静态向量成员实现 StrBlob<string> 吗?
- DLL – 在 DLL 初始化时填充的静态向量,向客户端程序返回零大小
- 如何通过参考传递向量的静态向量
- 无法在 c++ 中初始化静态向量
- C++类中的静态向量
- C++将局部变量添加到静态向量而不复制
- C :如何在类内声明一个空的私人静态向量
- 如何在运行时才知道c++静态向量大小时指定该大小-不需要
- 在C++类中找不到静态向量
- 静态向量的大小
- 在push_back到静态向量之后C++取消定位
- 如何在静态函数中使用静态向量
- 作为类对象容器的静态向量
- 类层次结构中所有对象的静态向量 shared_ptr
- 如何初始化静态向量成员
- 在元素自己的析构函数中擦除指向静态向量中元素的指针