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时,记下每一步的最好状态,每一个点只算一次

posted on 2024-03-21 15:15  Grylls_117  阅读(5)  评论(0编辑  收藏  举报