深搜
Template
组合
-
从 \(n\) 个元素中选出 \(k\) 个,不考虑顺序
\(\{1, 2\}\) 与 \(\{2, 1\}\) 视为 同一组合
-
数量:\(C_{n}^{k} = \frac{n!}{k! (n-k)!} = C_{n}^{n-k}\)
dfs 求组合
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
排列
-
从 \(n\) 和元素中选出 \(k\) 个,并考虑顺序
\(\{1, 2\}\) 与 \(\{2, 1\}\) 视为 不同排序
-
数量:\(A_{n}^{k} = \frac{n!}{(n-k)!}\)
dfs 求排列
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
全排列
-
从 \(n\) 和元素中选出 \(n\) 个,并考虑顺序
\(\{1, 2, 3\}, \{1, 3, 2\}, \{2, 1, 3\}, \{2, 3, 1\}, \{3, 1, 2\}, \{3, 2, 1\}\)
-
数量:\(n!\)
排列组合
-
从 \(n\) 和元素中选出 \(k\) 个,并考虑顺序,并允许重复
\(\{1, 1\}, \{1, 2\}, \{2, 1\}, \{2, 2\},\)
-
数量:\(n^k\)
如何表示,从上一层到下一层的多条路径?
AcWing 3502. 不同路径数 code
> `每次可以沿上下左右四个方向前进一步`意味着对于每个节点, 我们有四种选择 > 在代码中, 我们应该如何实现, 从 `{x,y}` -> `{x-1, y}` 这个点的操作呢 > 喜闻乐见的一种方式就是直接x-1, 但在比赛中, 我们常常通过一个 `dx[4], dy[4]` 数组来实现 > 可以模拟一下 `dx[4]={-1,0,1,0}, dy[4]={0,-1,0,1}` > `nx = x + dx[0]` > `ny = y + dy[0]` > 此时, 上下左右的转移就被我们写进了循环中, 大大减少了重复代码量C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
AcWing 1114. 棋盘问题 code
> 我们首先思考一下, 求方案数, 肯定是不能重复的 > 那么我们可以再回想一下, dfs的搜索方案会重复吗? 我们上一道一题的去重是为什么? > 思考完, 考虑一下这道题如何解决(自己尝试写一个, 先把输入写了), 他的关键之处在于`要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列` > 画一个4*4的图就好理解了, 直接平板上画 > 这时候, 就可以引入另外一个东西了`used`数组C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
|
AcWing 116. 飞行员兄弟 code
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
|
Luogu P1219 [USACO1.5]八皇后 Checker Challenge code
> 此题在上一题的基础上加入斜线C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
Acwing 1621. N 皇后问题 code
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
Acwing 4218. 翻转 code
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
|
AcWing 95. 费解的开关 code
C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
|
一般DFS
Luogu P2392 kkksc03考前临时抱佛脚 code
kkk 需要做 $4$ 科习题集 $A$ 科共有 $s_1$ 道题目,每道题目的消耗时间分别是 $A_1, A_2, A_3, ..., A_{s_1}$ $B$ 科共有 $s_2$ 道题目,每道题目的消耗时间分别是 $B_1, B_2, B_3, ..., B_{s_2}$ $C$ 科共有 $s_3$ 道题目,每道题目的消耗时间分别是 $C_1, C_2, C_3, ..., C_{s_3}$ $D$ 科共有 $s_4$ 道题目,每道题目的消耗时间分别是 $D_1, D_2, D_3, ..., D_{s_4}$ - kkk 可以同时计算两道题目,kkk 必须一科一科的复习 因此这个条件,**完成复习的最短时间 -> 完成每科的最短时间之和** 具体的,我们现在需要解决,完成 $s_i$ 道题目花费的最短时间 - 最短时间 $>=$ $\lceil 所有时间/2 \rceil$ 因此,我们不妨考虑 **做题时间的所有排列**,依次累加到 $res$ 当 $res >= \lceil 所有时间/2 \rceil$,$res$ 就是其中的一个可行解 最小的 $res$ 就是最短时间C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Luogu P1019 [NOIP2000 提高组] 单词接龙 code
给定一些单词,将单词连接起来 此时有两个问题 1. 对于单词 $a$ 和 $b$,$b$ 能否接到 $a$ 的后面 显然,我们只需要截取 $a$ 的后面 $i$ 位,$b$ 的前面 $i$ 位 如果截取的部分相同,且不等于 $a$ 和 $b$,那么 $b$ 就可以接到 $a$ 后面 2. 对于单词 $a$ 和 $b$,接龙后是什么样子? 我们已经知道他们相同的部分,那么只需要用 **$a + b剩下的部分$** 就是连接后的串 此时,我们只需要从第一个单词开始,看此单词能够与那些单词连接。然后是第二个单词...C++ | |
---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|