一.总述 分治算法其实就是将一个大问题分解为若干个类型相同但是规模较小的子问题,使用递归的方式一直分解下去,然后将子问题的解合并得到原问题的解的策略。 二.经典的分治算法列举 二分搜索、大整数乘法、strassen矩阵乘法、棋盘覆盖、合并排序、快速排序、线性时间选择、最接近点对问题、循环赛日程表、汉 ...
分类:
编程语言 时间:
2021-02-17 14:56:19
阅读次数:
0
https://ac.nowcoder.com/acm/contest/1062/B 【题目】 给出一张n×n(n≤100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少1*2的多米诺骨牌进行掩盖。 【题意】 题意简单,不做多说明,多米诺骨牌可以理解为长方形的方块。 【题解】 仔细一想,可以发现 ...
分类:
其他好文 时间:
2020-08-11 15:55:41
阅读次数:
74
一个骨牌为3格。 当棋盘边长为2,总格数(2^2-1)/3,发现可以整除。 那么因为棋盘边长为2^k,总格数(2^4-1)/3,可以用n^2-1=(n+1)(n-1)拆开,利用上一步,发现可以整除。 可以证的无论棋盘的边长,都可以在有一个奇异点的情况下被整除。 那么我们的目标是把大的棋盘一步步拆成边 ...
分类:
其他好文 时间:
2020-05-15 20:37:43
阅读次数:
83
「CH6801」棋盘覆盖 "传送门" 考虑将棋盘黑白染色,两个都无障碍的相邻的点之间连边,边的容量都为1,然后就求一次最大匹配即可 参考代码: ...
分类:
其他好文 时间:
2020-01-14 09:24:35
阅读次数:
70
也是基于状压dp的一种。最经典的问题莫过于棋盘覆盖了,例如用1*2orL型骨牌覆盖N*M棋盘得方案个数。一般M不会太大。 例如这一道,由于形状特殊,轮廓线长度为M+1才可,递推时只要满足轮廓线前面的格子都是满的且当前放置方案合法即可。 有四种不同放置方法, 黑色部分为当前枚举的位置(i,j),相当于 ...
分类:
其他好文 时间:
2020-01-09 20:42:14
阅读次数:
93
[Toc] 本文为 分治算法 的代码实现。 作者水平比较差,有错误的地方请见谅。 1、算法 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得 ...
分类:
编程语言 时间:
2019-11-09 13:35:25
阅读次数:
72
http://noi-test.zzstep.com/contest/0x60%E3%80%8C%E5%9B%BE%E8%AE%BA%E3%80%8D%E4%BE%8B%E9%A2%98/6801%20%E6%A3%8B%E7%9B%98%E8%A6%86%E7%9B%96 6801 棋盘覆盖 0x ...
分类:
其他好文 时间:
2019-11-01 09:57:39
阅读次数:
148
给出一张n n(n using namespace std; const int maxn=10010; int cx[4]={1,0,0, 1}; int cy[4]={0,1, 1,0}; int n,m,x,y,a[110][110]; bool used[maxn]; int match[m ...
分类:
其他好文 时间:
2019-08-26 23:10:13
阅读次数:
83
一、基本概念 分治法,顾名思义,即分而治之的算法,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…… 二、基本思想及策略 设计思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 策略:对于一个规模为n的问题,若该问题可以容易地 ...
分类:
编程语言 时间:
2019-06-23 20:52:30
阅读次数:
215
题面: "link" cpp include include using namespace std; int a[1024][1024]; int cnt = 0; int n, kr, kc; void solve(int k, int r, int c, int x, int y) { if ...
分类:
其他好文 时间:
2019-06-22 13:29:19
阅读次数:
135