摘要: 题面 看题目就知道这是一个点覆盖型树形DP。 首先定义状态。设 \(f_i\) 为 \(i\) 节点的状态。 那么, \(f_i\) 有三种情况: 自己不放置坑爹。 儿子坑了自己。 儿子全部自给自足,自己不放置,靠儿子养活。 三个状态分别如图所示: 知道状态以后,转移就很简单了。 初始状态:坑爹,因 阅读全文
posted @ 2021-08-13 15:00 Chiimo 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 题面 一道看上去像道换根DP但可以用其他方法水过去的题目,正解显然是换根DP。 考虑换根DP两个步骤,一个是求 \(f_1\) ,第二是由 \(f_u\) 推出 \(f_v\) 。 先是状态的定义。 \(f_i\) 表示以 \(i\) 为根的答案。 然后考虑"反向边"怎么存,因为不能不存。这个可以用 阅读全文
posted @ 2021-08-13 05:41 Chiimo 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 题面 这个题就是个暴力题。 暴力从后往前枚举每一个状态,对于每一个状态暴力枚举每一种操作,然后暴力转移。 就是操作的时候位运算要看好是 << (l-1) 还是 << l 。另外就没什么难点了。 代码 阅读全文
posted @ 2021-08-11 15:52 Chiimo 阅读(5) 评论(0) 推荐(0) 编辑
摘要: 题面 看到数据范围显然是个状压DP。 考虑记录两个数组, \(dis\) 和 \(f\) 。\(dis\) 数组表示当前状态走了多少路程, \(f\) 数组表示当前状态有多少种走法。 显然 \(dis\) 数组可以随便推,在当前状态中随便取一位 \(p\) ,然后计算 \(dis_s=dis_{s- 阅读全文
posted @ 2021-08-11 05:11 Chiimo 阅读(12) 评论(0) 推荐(0) 编辑
摘要: 题面 可恨的getchar。 一般的状压dp。 因为空间不够开 \(100\times 2^{10} \times 2^{10}\) ,所以我们使用滚动数组。 如何滚动呢?我们在记录行数的那一维全部 \(\operatorname{mod}3\) 即可。因为当前行的状态只取决于前两行的状态。 然后就 阅读全文
posted @ 2021-08-10 18:40 Chiimo 阅读(11) 评论(0) 推荐(0) 编辑
摘要: 题面 显然是个状压DP。 看数据范围,不难发现算法复杂度应该是 \(O(n\times 2^n \times 2^n)\) 。 显然第一个 \(n\) 是遍历每一行的土地。 后面两个 \(2^n\) ,想都不用想就知道是暴力枚举上一行和这一行的状态。 而枚举状态这个东西比较浪费时间,所以我们可以先不 阅读全文
posted @ 2021-08-09 19:15 Chiimo 阅读(13) 评论(0) 推荐(0) 编辑
摘要: 题面 看起来非常简单,但是细节多的一批的状压DP入门题。 我设 \(f_i\) 为 \(i\) 状态时最小分组数, \(g_i\) 为 \(i\) 状态时最后一组剩余空间。 对于每一个 \(i\) ,枚举每一个 \(1\le j\le n\) 且 \(j\) 不在 \(i\) 内, 即 \(i \& 阅读全文
posted @ 2021-08-09 16:15 Chiimo 阅读(12) 评论(0) 推荐(0) 编辑
摘要: 题面 模拟退火练手好题。 对于这个题,一般有两种解法: 每次随机两个数交换。 每次直接打乱数组。 两个方法都可以过,我写了第一种,因为不想用stl。 代码 阅读全文
posted @ 2021-08-07 17:21 Chiimo 阅读(10) 评论(0) 推荐(0) 编辑
摘要: 题面 首先,对于每个数,有三种状态:选入集合A,选入集合B,或者不选入集合。暴力枚举的时间复杂度是 \(O(n\times3^n)\) ,显然跑不过去。 因此考虑 \(\text{Meet in Middle}\) 。记录选取前半部分的数时的总和,然后和右边每次搜索的结果进行匹配。 我设两个集合分别 阅读全文
posted @ 2021-08-05 16:38 Chiimo 阅读(14) 评论(0) 推荐(0) 编辑
摘要: 题面 本人用的是暴力分类讨论 + \(unordered\_map\) 存储,与所有的题解都不同。 因为 \(n \leq 6\) ,非常的小,并且我不想写 DFS,所以直接暴力分类讨论 \(n=1,n=2,\dots,n=6\) 的情况。 当 \(n \leq 3\) 时,可以用循环嵌套来解决,这 阅读全文
posted @ 2021-08-04 16:31 Chiimo 阅读(22) 评论(0) 推荐(0) 编辑