递归函数
斐波那契数列中的递归,有许多项会反复出现,可以将他们存在数组里。
int memo[MAX_N]
int fib(int n)
{
if (n <= 1) return n;
if (memo[n] != 0) return memo[n];
return memo[n] = fib(n-1) + fib(n-2);
}
栈
实现数据后入先出
#include<stack>
#include<cstdio>
using namespace std;
int main()
{
stack<int> s; //声明储存int类型的栈
s.push(1); //{} -> {1}
s.push(2); //{1} -> {1,2}
s.push(3); //{1,2} -> {1,2,3}
printf("%d",s.top()); // 3
s.pop() //从栈顶移除3
return 0;
}
队列
实现数据先入先出,用于暂时按顺序存储数据。
#include<cstdio>
#include<queue>
using namespace std;
int main()
{
queue<int> que; //声明int类型的队列
que.push(1); //{}->{1}
que.front(); //队首元素
que.pop(); //从队首弹出一个元素
return 0;
}
深度优先搜索
它从某个状态开始,不断地转移知道无法转移为止,然后回到前一个状态,继续转移到其他状态,如此反复不断。例如数独。
Lake Counting (POJ No,2386)
宽度优先搜索
它是按照初始状态->只需一次就可以转移到的状态->需要两次。。。。
复杂度为 O(状态数x转移方式)
例如迷宫问题。
特殊状态的枚举
next_permutation 函数
剪枝
在递归搜索中,把没有必要的搜索去掉。