摘要:
#[拦截导弹](https://www.acwing.com/problem/content/description/1012/) 贪心策略如下所示:图一表示具体做法,图二表示证明 ![image-20230520074148428](https://img2023.cnblogs.com/blog 阅读全文
摘要:
蒙德里安的梦想 如果横的放置确定了,那么纵向的肯定也确定了。所以只需要计算横着的方案数即可。 考虑使用 $f[i][j]$ 表示当前已经处理到了第 $i$ 列,状态为 $j$(状态表示这一列的每个位置是否被长方形占据了)。然后转移的话可以从上一列的许多状态中转移,但是需要满足两个条件 保证当前状态和 阅读全文
摘要:
这道题与 数独 几乎完全相同,只是需要计算靶形得分,可以直接使用一个 $9\times 9$ 的矩阵,如下代码 #include<bits/stdc++.h> using namespace std; const int num[9][9]={ {6,6,6,6,6,6,6,6,6}, {6,7,7 阅读全文
摘要:
破坏正方形 首先计算出火柴总数和正方形总数。 考虑横着的火柴有 $n+1$ 行,每行有 $n$ 根,竖着的同理(旋转 $90°$),所以一共有 $2n(n+1)$ 根火柴。 边长为 $1$ 的正方形有 $n^2$ 个,$2,(n-1)^2;3,(n-2)^2;\dots;n,1^2$,$\sum_{ 阅读全文
摘要:
排书 此题使用 $IDA*$ 解决。首先是一个迭代加深的 dfs,然后判断条件里是类似于 $A*$ 的条件,如果当前的估价 $+$ 当前的实际花费 $\ge$ 答案就可以返回了。 这里比较显然,无需证明,比 $A*$ 的证明简单。 考虑统计中间八个格子中的众数 $x$。由于每次最多移入一个数,移出一 阅读全文
摘要:
排书 此题使用 $IDA*$ 解决。首先是一个迭代加深的 dfs,然后判断条件里是类似于 $A*$ 的条件,如果当前的估价 $+$ 当前的实际花费 $\ge$ 答案就可以返回了。 这里比较显然,无需证明,比 $A*$ 的证明简单。 考虑每次都会更改如上图所示的三个数的后继关系,所以每次最多消除 $3 阅读全文
摘要:
k短路 这道题考察的还是 $A*$ 算法。 首先考虑设立估价函数:当前点到终点的最短路(因为从当前点到终点的所有路径中最短路最短,一定满足 $\le$)。只需要在反向图上做一遍 dijkstra 就能求得。 然后考虑证明第 $i$ 次弹出的就是第 $i$ 短路。类似 $A*$ 中的证明。 #incl 阅读全文
摘要:
八数码问题 $A*$ 算法例题。 首先判断是否有解。这里有一个条件:将八数码转化为序列后如果逆序对数为偶数,一定有解,否则一定无解。 充分性难证明,只证明必要性:只要是有解必定是偶数。 行内移动序列没有变,数量不变。 如果上下移动发现逆序对变化是 $[0,±2]$。 而答案序列逆序对为 $0$,为偶 阅读全文
摘要:
$A*$ 算法 这个算法其实就是 dijkstra 的变种,是对于一般的 bfs 的一种优化手段。 首先需要设置一个东西叫做估价函数。普通的 bfs 的估价函数一般取 $0$。这个东西如果你要保证一定正确,记起点到当前点的距离为 $d[i]$,到末尾的真实距离为 $g[i]$,设你的估价函数是 $f 阅读全文
摘要:
字典树最多构建节点个数计算 给定 $n,k$,然后随机 $n$ 个长度为 $k$ 的 01 串,求所有情况下将这 $n$ 个串构建成字典树中节点数最多可能有几个。注意,构建方式是扫描每个串,注意是从这个串第一个字符到最后一个,依次加入字典树。说人话:基本构建方式。 如图,$n=3,k=2$ 时,节点 阅读全文