1.位运算与bitset
位运算:
& 按位与
| 按位或
^ 按位异或
.>> 右移
.<< 左移
! 按位非
bitset:
一种STL数据结构,可用来表示集合。
定义:
bitset<大orSIZE> s;
基本函数:
1.s[x]=0 or 1; 将s的x位改为0或1.
2.s.count(); s中,1的个数。
3.s.all / any / none (); 返回s是否 全是1 / 存在1 / 没有1;
bitset可以进行位运算(如s &= s2 (s,s2为bitset),s>>=2);
2. DFS, BFS, 记忆化搜索,剪枝
DFS( 暴力枚举 深度优先搜索)
常用于从X个东西中选R个东西,枚举方案一类的题目。
框架:
void dfs(int x){ ..-------------------->... x代表目前已搜到x号元素。
if(搜完了) ...代码... return;
for(接下来能搜的所有元素){
if(合法) ...标记...dfs(i);...回溯...
}
}
用DFS遍历图:
深度优先,即 一路走到黑,碰壁了,换条路走
图例:
.....1 .........1通向2,3
..2......3 ...2通向4,3通向5,6;
4......5....6
DFS结果: 1->2->4碰壁,回溯->2碰壁,回溯->1->3->5回溯->3->6
1->2->4->3->5->6;
用BFS遍历图:
广度优先,即 一层一层搜,每一步考虑所有可能。(用队列)
图例:
.....1 .........1通向2,3
..2......3 ...2通向4,3通向5,6;
4......5....6
BFS结果:
第一步: 1 .....队列: 1
第二步: 1->2,1->3; ........队列:1 2 3
第三步:2->4; ..........队列: 2 3 4
第四步: 3->5 3->6 .............队列: 3 4 5 6
1->2->3->4->5->6
复杂度 O(n)
记忆化搜索
DFS时,记下每一步的最好状态,每一个点只算一次