算法
Joe_2005
这个作者很懒,什么都没留下…
展开
-
状态压缩方法
状态压缩方法状态压缩是信息学竞赛中一个很常见的方法,最最常见的是二进制压位。做过USACO的同学会知道有很多搜索和DP都可以用状态压缩优化。一般来讲,如果状态的够成非常多,但每个构成相对简单,就可以状态压缩,比如巨大的0/1矩阵等。当然如果状态压缩,提取每个数据起来就会耗费更多的时间,所以一般运用在状态复制量较大,比较量较小的情况下。举例:多关键字排序可转载 2017-07-03 15:26:47 · 407 阅读 · 0 评论 -
洛谷 P1484 种树
题目链接题目描述cyrcyr今天在种树,他在一条直线上挖了n个坑。这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树。而且由于cyrcyr的树种不够,他至多会种k棵树。假设cyrcyr有某种神能力,能预知自己在某个坑种树的获利会是多少(可能为负),请你帮助他计算出他的最大获利。输入输出格式输入格式: 第一行,两个正整数n,k。第二行,n...原创 2018-06-23 22:54:35 · 632 阅读 · 1 评论 -
洛谷P3388 【模板】割点(割顶)
题目链接题目背景 割点题目描述 给出一个n个点,m条边的无向图,求图的割点。输入输出格式 输入格式: 第一行输入n,m下面m行每行输入x,y表示x到y有一条边输出格式: 第一行输出割点个数第二行按照节点编号从小到大输出节点,用空格隔开输入输出样例 输入样例#1: 复制 6 7 1 2 1 3 1 4 2 5 3 5 4 5 5 6 输出样例...原创 2018-05-08 20:39:06 · 324 阅读 · 0 评论 -
C++ stl队列queue用法介绍
转自:http://www.169it.com/article/2718050585107790752.html C++队列queue模板类的定义在头文件中,queue 模板类需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque 类型。C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。C++队列...转载 2018-02-22 16:14:02 · 906 阅读 · 0 评论 -
浅谈用极大化思想解决最大子矩阵问题
【摘要】 本文针对一类近期经常出现的有关最大(或最优)子矩形及相关变形问题,介绍了极大化思想在这类问题中的应用。分析了两个具有一定通用性的算法。并通过一些例题讲述了这些算法选择和使用时的一些技巧。【关键字】 矩形,障碍点,极大子矩形【正文】一、 问题最大子矩形问题:在一个给定的矩形网格中有一些障碍点,要找出网格内部不包含任何障碍点,且边界与坐标轴平行的最大子矩形。这是近...转载 2018-02-27 22:24:31 · 397 阅读 · 0 评论 -
最大子矩形问题模板
浅谈用极大化思想解决最大子矩阵问题算法1:时间复杂度O(s^2)s为障碍物个数 题目:奶牛浴场#include<bits/stdc++.h>using namespace std;struct node{ int x, y;}a[5010];bool cmp1(node x, node y){ return x.y < y.y;}bo...原创 2018-02-27 21:15:48 · 307 阅读 · 0 评论 -
洛谷 P3387 【模板】缩点
P3387 【模板】缩点题目链接题目背景 缩点+DP题目描述 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大。你只需要求出这个权值和。允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。输入输出格式 输入格式: 第一行,n,m第二行,n个整数,依次代表点权第三至m+2行,每行两个整数u,v,表示u->v有...原创 2018-02-26 23:21:46 · 390 阅读 · 0 评论 -
Tarjan算法详解
强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。Tarjan算法:求解有向图强连通分量的线性...原创 2018-02-26 23:13:26 · 5502 阅读 · 1 评论 -
洛谷P2577 [ZJOI2005]午餐
这道题目比较难想。算法:贪心+dp容易想到贪心:吃饭慢的先打饭节约时间, 所以先将人按吃饭时间从大到小排序。然后就是dp了: 首先,应该想到f[i][j][k]:前i个人,在1号窗口打饭总时间j,在2号窗口打饭总时间k 当然,这样会爆空间,所以想到去掉一维。 f[i][j]表示前i个人,在1号窗口打饭总时间j,最早吃完饭的时间 我们可以发现 j+k=前i个人打饭总和,k = s...原创 2018-02-21 17:32:43 · 1158 阅读 · 0 评论 -
洛谷P2224 [HNOI2001]产品加工题解
dp: 首先想到二维dp f[i][j] 表示前i件产品,第一个机器用时j,第二个机器用时f[i][j] 所以转移方程就出来了:f[i][j] = min(f[i-1][j]+t2, f[i-1][j-t1], f[i-1][j-t3]+t3) 二维当然会爆空间啦 所以可以滚掉i代码如下:#include<bits/stdc++.h>using namespa...原创 2017-10-13 19:22:52 · 804 阅读 · 0 评论 -
KMP算法(C++)
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html原创 2017-07-23 22:09:47 · 197 阅读 · 0 评论 -
kmp算法解析
kmp算法是一个效率非常高的字符串匹配算法。不过由于其难以理解,所以在很长的一段时间内一直没有搞懂。虽然网上有很多资料,但是鲜见好的博客能简单明了地将其讲清楚。在此,综合网上比较好的几个博客(参见最后),尽自己的努力争取将kmp算法思想和实现讲清楚。kmp算法完成的任务是:给定两个字符串O和f,长度分别为n和m,判断f是否在O中出现,如果出现则返回出现的位置。常规方法是遍历a的每一个位置,转载 2017-01-19 18:11:00 · 207 阅读 · 0 评论 -
求两个数组的最长公共子序列(LCS)
求两个数组的最长公共子串长度(LCS)样例输入:5 51 3 2 0 31 0 2 3 3输出:3求两个数组的最长公共子串长度(LCS),思路其实很简单,两个数组s[i],t[i]。f[i][j]表示s[1~i-1]和t[1~j-1]的LCS,然后如果s[i]==t[j]那么这一位可以加进LCS,即if(s[i]==s[j])原创 2017-02-05 18:43:26 · 5334 阅读 · 1 评论 -
Luogu P4115Qtree4 P2056[ZJOI2007]捉迷藏 题解
题目链接[ZJOI2007]捉迷藏 P4115 Qtree4题解动态点分治+堆点分树 : 我们把分治过程中遍历过的重心都连起来 上一层的重心连接下一层的重心 可以得到一棵新的树然后在这颗树上乱搞先对于每个点弄两个大根堆q1[x] 存x的所有白点后代到x的父亲 的原树上的距离q2[x] 存x的每个子树中到x 的原树上的最大距离显然, q2为x所有儿子q1的根节点然后再弄一...原创 2018-10-10 19:16:02 · 226 阅读 · 0 评论