09 2015 档案
摘要:问题给定两个序列A和B,序列的子序列是指按照索引逐渐增加的顺序,从原序列中取出若干个数形成的一个子集,若子序列的数值大小是逐渐递增的则为上升子序列,若A和B取出的两个子序列A1和B1是相同的,则A1/B1为A和B的公共子序列。求出A和B的最长公共上升子序列。分析结合最长公共子序列和最长上升子序列来解...
阅读全文
摘要:编辑距离是指两个字串之间,从一个转成另一个所需要的最少编辑操作次数,许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。问题给定两个字符串S1和S2,求S2和S1的编辑距离,即至少需要经过多少步编辑操作才可以将S1变成S2。分析定义“状态” edit[i][j],表示将S1的长...
阅读全文
摘要:最长公共子序列(LCS)是一类典型的动归问题。 问题 给定两个序列(整数序列或者字符串)A和B,序列的子序列定义为从序列中按照索引单调增加的顺序取出若干个元素得到的新的序列,比如从序列A中取出 A[i1], A[i2], ...A[ik],其中0=< i1 <= i2 <= ... ik <= n-
阅读全文
摘要:题目大意给定一列数,从中选择两个不相交的连续子段,求这两个连续子段和的最大值。题目分析典型的M子段和的问题,使用动态规划的方法来解决。f[i][j] 表示将A[1...i] 划分为j个不相交连续子串,且A[j]属于第i个子串,所能达到的最大子串和g[i][j] 表示将A[1...j]划分为i个不相交...
阅读全文
摘要:题目大意 一条单向的高速公路上有N辆车,在0时刻,每辆车分别在起点A[0],A[1]....处开始从北向南出发,每辆车有个终点B[0],B[1]....且每辆车有个限制速度 V[0],V[1]... 路上不能超车,即车X可能因为速度较慢,会挡住后面的车Y,但车X到达它的终点之后就消失了,不会再阻挡后
阅读全文
摘要:一、最大子段和问题给定N个数A1, A2, ... An,从中选出k(k不固定)个连续的数字 Ai, Ai+1, ... Ai+k-1,使得∑i+k−1iAt达到最大,求该最大值。分析求最大子段和可以用多种算法来解决.(1)直接枚举max = 0;for i in [1...n] for j ...
阅读全文
摘要:题目大意 N个士兵排成一排,不是按照高度顺序排列。现在想要从中去掉几名士兵,从而使得队伍中剩余的士兵能够看到这排最左边或者最右边的那个士兵,某士兵能够看到最左边(或最右边)的士兵指这名士兵和最左边(或最右边)士兵之间没有另外一名士兵的高度大于等于这名士兵。 题目分析 典型的最长xx子序列问题,能够满
阅读全文
摘要:问题 最长上升子序列是一类经典的动态规划问题。 给定N个数字, A1,A2,....An,从中选择k个数字 At1, At2,... Atk,满足 1 =< t1 < t2 < .. < tk <= n,且 At1 < At2 < ... < Atk,求满足要求的最大的k。 分析 设一个动归数组dp
阅读全文
摘要:题目大意顾客拿着N种硬币(币值为value[i], 数量为c[i])去买价值为T的东西,商店老板也有同样N种币值的硬币,但是数量不限。顾客买东西可能需要用硬币找零来使得花出去的钱为T,求顾客给老板的硬币数为count1,老板找回给顾客的硬币数目为count2,求count1 + count2的最小值...
阅读全文
摘要:题目大意有N个数字,大小为a[i], 给定一个数S,用这N个数中的某些数加起来使得结果sum>= S,且sum-S最小,求该最小的sum-S值。题目分析题意中可知,这N个数字的和肯定大于S。那么可以先判断对于大于S的数s1,能否利用这N个物品的某些组合得到,然后找到最小的s1即可。利用动态规划的思想...
阅读全文
摘要:背包问题是一类非常典型的动态规划问题,包括多种类型(01背包、完全背包、多重背包、混合背包、二维费用背包等)其基本类型为01背包问题。 一、01背包问题 N件物品,每件物品的重量和价值分别为 w[i], v[i], 把这些物品放到一个容量为W的背包中,求背包中物品的价值的最大值。 形式化定义: 分析
阅读全文
摘要:题目大意给出一个柱形图中柱子的高度,每个柱子的宽度为1,柱子相邻。求出柱形图中可能形成的矩形的最大面积。题目分析以每个柱子(高度为h[i])为中心,向两边延展求出以该h[i]为高度的矩形的最大宽度w[i]。h[i]*w[i]得到以该柱子为中心的最大矩形面积,遍历一遍之后取最大值即可。关键在于求出以柱...
阅读全文
摘要:题目大意定义字符串T的子串T(i, k)=TiTi+1...Ti+k-1, 1≤i≤i+k-1≤|T|. 给定两个字符串A和B,定义集合S为S = {(i, j, k) | k≥K, A(i, k)=B(j, k)}.对于给定的字符串A和B,求出满足要求的集合S的大小。题目分析就是求A和B中有多少个...
阅读全文
摘要:题目大意给定一行数,共N个。有一个长度为K的窗口从左向右滑动,窗口中始终有K个数字,窗口每次滑动一个数字。求各个时刻窗口中的最大值和最小值。题目分析直接搜索,复杂度为O(n^2)。本题可以看做是一个区间求最大值最小值的问题,因此考虑使用线段树解决。和用单调队列方法相比,时间复杂度O(nlogn),略...
阅读全文
摘要:题目大意给定一行数,共N个。有一个长度为K的窗口从左向右滑动,窗口中始终有K个数字,窗口每次滑动一个数字。求各个时刻窗口中的最大值和最小值。题目分析直接搜索,复杂度为O(n^2)。考虑使用单调队列,单调队列中的元素(或者元素的相关信息)单调递增或者递减。在本题中用一个单调递增的队列A保存当前窗口中值...
阅读全文
摘要:题目大意 N头牛排成一列,每头牛A都能看到它前面比它矮的牛i,若前面有一个比他高的牛X,则X之前的牛j,A都无法看到。给出N头牛的高度,求出这N头牛可以看到牛的数目的总数。 题目分析 画图之后,可以很容易看出是典型的单调栈问题。单调栈问题中栈元素一般有两个属性:一是牛的索引位置,二是牛的高度。每次得
阅读全文
摘要:题目大意给出一个数字串,找出其中至少重复K次的最长的子串长度。题目分析直接用后缀数组来求解,限制height[i]的长度来对排好序的后缀进行分组(这种方法经常在字符串问题中被使用)。先判断是否有至少K个长度大于等于M的子串,这可以通过将height[i] >= M来对排好序的后缀进行分组,然后判断组...
阅读全文
摘要:题目大意给定一串数字,长度为N。定义数字中的某个连续的子串为一个"theme",只要子串满足:(1)长度 >= 5(2)和该子串相同或者该子串的“变种串”在整串数字中出现次数大于1(3)假设整串中有k个该子串及其“变种串”,那么其中至少有两个不相重叠求满足要求的 "theme" 串的最长长度。题目分...
阅读全文
摘要:题目大意给定两个字符串A,B,求出A和B中最长公共子串的长度。题目分析字符串的子串可以认为是是字符串的某个后缀的前缀,而求最长公共子串相当于A和B的某两个后缀的最长相同前缀。可以考虑使用后缀数组,将A和B连接起来,中间添加一个在A和B中都未出现过的字符隔开,然后求这个新串的后缀数组以及height数...
阅读全文
摘要:后缀数组是处理字符串的一种常用算法,是后缀树的一种精巧的替代品,它比后缀树更容易编程实现,且效率和后缀树相当。后缀数组定义子串: 字符串S的子串r[i, j](i = h[i-1]-1设Suffix(k)是排在Suffix(i-1)前一名的后缀,他们的最长公共前缀是h[i-1]。那么Suffix(k...
阅读全文
摘要:扩展KMP问题给定母串S,子串T。定义n = len(S), m = len(T), exend[i] = S[i....n-1]与T的最长公共前缀,在线性时间复杂度内,求出所有的extend[0....n-1].如果有某个位置i满足extend[i] = m,那么T就肯定在S中出现过,并且进一步知...
阅读全文
摘要:题目大意有N个病毒,病毒由A-Z字母构成,N个病毒各不相同。给出一段程序P,由A-Z字母构成,若病毒在在程序P或者P的逆转字符串P'中存在,则该程序P被该病毒感染。求出程序P被多少种病毒感染。题目分析典型的多模式串的字符串匹配问题,考虑使用Trie图。将M个待查的字符串作为模式串插入Trie图中,然...
阅读全文
摘要:题目大意给出一个RxC的字符组成的puzzle,中间可以从左向右,从右到左,从上到下,从下到上,从左上到右下,从右下到左上,从左下到右上,从右上到左下,八个方向进行查找字符串。给出M个字符串,找出他们在puzzle中的位置,返回该字符串在puzzle中的起点横纵坐标以及方向。字符串长度L #incl...
阅读全文
摘要:DFA 确定性有限状态自动机 DFA确定性有限状态自动机是一种图结构的数据结构,可以由(Q, q0, A, Sigma, Delta)来描述,其中Q为状态集,q0为初始状态,A为终态集合,Sigma为字母表,Delta为转移函数。它表示从唯一一个起始状态q0开始,经过有限步的Delta转移,转移是根
阅读全文
摘要:题目大意给定一系列电话号码,查看他们之间是否有i,j满足,号码i是号码j的前缀子串。题目分析典型的trie树结构。直接使用trie树即可。但是需要注意,若使用指针形式的trie树,则在大数据量下new/delete会很耗时,因此使用静态数组来存储trie树结构。使用静态数组代替指针在oj中常用于节省...
阅读全文
摘要:题目大意将一副牌进行编号,四种花色分别标记为'C'、'D'、'H'、'S',数值标记为'A'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'、'10'、'J'、'Q'、'K',则一张牌可以标记为 “数值+花色”,比如 7D, AH, 10S等。给出N个牌的序列,每个序列视为一...
阅读全文
摘要:Trie树结构Trie树是一种树形数据结构,又称为单词查找树、字典树,是一种用于快速检索的多叉树结构。典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的主要设计思想是空间换时间,利用字符串的公共前缀来降低查询时间的开销。它的优点是可以最大限度的减少无谓...
阅读全文
摘要:题目大意给出一个字符串S,S可能是多个较短的字符串的重复连接。比如"ababab"为字符串"ab"重复三次的结果;"abc" 为"abc"重复一次的结果;"abababab"可能是"abab"重复两次,也可能是"ab"重复四次的结果。对一个给定的字符串S,求出最大的k,使得它为某个子串A重复k次的结...
阅读全文
摘要:题目大意给定字符串S,求出S的所有可能相同前后缀的长度。比如:"alala"的前缀分别为{"a", "al", "ala", "alal", "alala"}, 后缀分别为{"a", "la", "ala", "lala", "alala"}. 其中有{"a", "ala", "alala"}是相同...
阅读全文
摘要:题目大意给定两个字符串S1, S2,求S1中包含多少个S2串。其中S1长度最大为 1000000, S2长度最大为10000。题目分析典型的字符串匹配问题,直接匹配显然会超时,考虑使用kmp算法。需要注意的是,尽量减少求串长度的strlen的执行次数。实现(c++)#define _CRT_SECU...
阅读全文
摘要:KMP算法是字符串匹配处理中一种非常高效的算法,它的时间复杂度可以达到O(N+M),远优于普通匹配的O(NxM)。它最早是由Knuth,Morris,Pratt共同提出。 算法原理 普通的字符串匹配,假设从母串的A位置开始匹配,在某个位置B当母串和子串失配的时候匹配的起点会回溯到A+1处重新开始。而
阅读全文
摘要:惰性求值惰性求值一般用于函数式编程语言中,在使用延迟求值的时候,表达式不在它被绑定到变量之后就立即求值,而是在后面的某个时候求值。可以利用c++11中的std::function, lambda表达式以及c++11实现的Optional来实现lazy。其中,std::function用来保存传入的函...
阅读全文
摘要:optionalc++14中将包含一个std::optional类,optional内部存储空间可能存储了T类型的值也可能没有存储T类型的值。当optional被初始化之后,可以通过operator bool() 获得true的返回值,否则返回值为false,这样可以知道该optional内部是否有...
阅读全文
摘要:在c++11之前,类模板和函数模板只能含有固定数量的模板参数,c++11增加了可变模板参数特性:允许模板定义中包含0到任意个模板参数。声明可变参数模板时,需要在typename或class后面加上省略号"..."。省略号的作用有两个:1. 声明一个参数包,这个参数包中可以包含0到任意个模板参数2. ...
阅读全文
摘要:题目大意 一家超市,要卖出N种物品(每种物品各一个),每种物品都有一个卖出截止日期Di(在该日期之前卖出可以获得收益,否则就无法卖出),且每种物品被卖出都有一个收益值Pi. 卖出每个物品需要耗时1天,且任一时刻只能卖出一个物品。给出这N种物品的Di和Pi,求最大收益值。 题目分析 求最优值问题,可以
阅读全文
摘要:1. new/deletec++中的new(和对应的delete)是对堆内存进行申请和释放,且两个都不能被重载。2. operator new/operator deletec++中如果想要实现不同的内存分配行为,需要重载operator new,operator delete。operator n...
阅读全文
摘要:一、 c++ traitstraits是c++模板编程中使用的一种技术,主要功能:把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用traits提取的属性,使得函数对不同的参数表现一致。traits是一种特性萃取技术,它在Generic Progr...
阅读全文
摘要:使用c++的时候,经常会在 const int *p 和 int * const p这个地方迷惑。这里记录一下: const int *p = int const *p //这里const后面的为*p, 将他们视为一个整体,即 *p是const的,即p指针指向的内容是不可以修改的;但是p是可以修改的
阅读全文
摘要:使用emplace_back就地构造emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好的避免内存的拷贝和移动,使得容器插入元素的性能得到进一步提升。在大多数情况下应该优先使用emplace_back来代替push_back.所有的标准库容器(arra...
阅读全文
摘要:std::movec++11中提供了std::move()来将左值转换为右值,从而方便的使用移动语义。move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存拷贝。c++中所有容器都实现了move语义,方便我们实现性能优化。move只是转移了资源的控制权,本质上是将左值强制转换...
阅读全文
摘要:1. 左值和右值 左值是表达式结束之后仍然存在的持久化对象,而右值是指表达式结束时就不再存在的临时对象。 c++11中,右值分为两种类型:将亡值(xvalue, expiring value),另一个是纯右值(prvalue, pure rvalue). 非引用返回的临时变量、运算表达式产生的临时变
阅读全文
摘要:tuple是一个固定大小的不同类型值的集合,是泛化的 std::pair。可以当做一通用的结构体使用,不需要创建结构体而又获取结构体的特征,在某些情况下可以取代结构体,使程序简洁、直观。创建tuple 1. make_tupe tuple tp = make_tuple(sendPack...
阅读全文
摘要:lambda表达式函数式编程的一个语法,有如下优点:(1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式写程序,好的可读性和可维护性。(2)简洁:不需要额外再写一个函数或者函数对象,避免了代码膨胀和功能分散。(3)在需要的时间和地点实现功能闭包,...
阅读全文
摘要:c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值。可调用对象c++中的可调用对象存在以下几类:(1)函数指针(2)具有operator()成员函数的类对象(仿函数)(3)可被转换为函数指针的类对象(4)类成员(函数)指针void f...
阅读全文
摘要:c++11中有基于范围的for循环,基于范围的for循环可以不再关心迭代器的概念,只需要关系容器中的元素类型即可,同时也不必显式的给出容器的开头和结尾。int arr[] = {1, 2, 3, 4};for(int a : arr){...}vector str_arr{"hello", "wor...
阅读全文
摘要:1. 使用列表初始化在c++98/03中,对象的初始化方法有很多种,例如int ar[3] = {1,2,3};int arr[] = {1,2,3}; //普通数组struct A{ int x; struct B{ int y; int z; } ...
阅读全文
摘要:c++11改进了编译器的解析规则,尽可能的将多个右尖括号(>)解析为模板参数结束符,方便编写模板相关的代码。1. 模板的右尖括号之前的c++标准中,模板套模板中右尖括号不能连在一块,否则会和右移操作符混淆,如 vector > //右边的两个>要分开。而在c++11中,这种限制取消了,编译器能够判断...
阅读全文
摘要:c++11中引入了auto和decltype关键字实现类型推导,通过这两个关键字不仅能够方便的获取复杂的类型,而且还能简化书写,提高编码效率。auto和decltype的类型推导都是编译器在编译的时候完成的,auto是通过定义auto变量时候给出的表达式的值推导出实际类型,并且在声明auto变量时必...
阅读全文
摘要:题目大意动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B,B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第...
阅读全文
摘要:题目大意开始有N堆砖块,编号为1,2....N,每堆都只有一个。之后可以进行两种操作:(1)M X Y 将编号为X的砖块所在的那堆砖拿起来放到编号为Y的砖块所在的堆上;(2)C X 查询编号为X的砖块所在的堆中,在砖块X下方的所有砖块的数目题目分析典型的集合合并和查询,因此采用并查集。并查集的基本框...
阅读全文
摘要:题目大意一个学校里面有n个学生(标号从0到n-1)和m个社团(标号从0到m-1),每个学生属于0个或多个社团。近期有SARS传播,属于同一个社团的学生的SARS可以相互传染。给出m个社团中的学生标号,已知学生0被传染了SARS,求所有可能被传染SARS的人数。题目分析典型的集合操作,求集合的大小。可...
阅读全文
摘要:题目大意左右两个竖排,左边竖排有N个点,从上到下依次标记为1,2,...N; 右边竖排有M个点,从上到下依次标记为1,2....M。现在从K条直线分别连接左边一个点和右边一个点,求这K条直线的交点个数(左右竖排上的点不算做交点)。给出N,M,K,以及K条线的起点和终点。题目分析求两两交点的问题最好固...
阅读全文
摘要:题目大意n个数排成一排(不知道大小,只是占了一个位置),从a[1]到a[n]进行遍历,对于每个a[i],给出从a[1]到a[i-1]中小于a[i]数的个数。要求出 a[1]到a[n]中这n个数的相对顺序。题目分析对于每个数 a[i], 给出了从 a[1] -- a[i-1]中小于a[i]的个数 le...
阅读全文
摘要:题目大意给定一个S*S的矩形,该矩形由S*S个1x1的单元格构成,每个单元格内可以放一个整数,每次有如下可能操作:(1)改变某个单位单元格中的数的大小(2)查询由若干个连续单元格构成的X*Y的大小的矩形内所有数的总和题目分析典型的区间操作,而且是单点更新,区间查询。因此使用树状数组,不过应该使用二维...
阅读全文
摘要:动态规划问题的特征最优子结构问题的最优解包含的子问题的解也是最优的 —— 从子问题的最优解推出问题的最优解无后效性当前的状态值一旦确定,则后续的状态的确定只和这些状态的值有关,而和到达这些状态的路径无关(这样才可能保存状态,且状态推演)动态规划一般步骤分解子问题子问题和原问题类似,且需要保存子问题的...
阅读全文
摘要:树状数组基本概念树状数组也是进行区间操作的常用数据结构。树状数组适用于单个元素经常修改,而且还反复求部分的区间和的情况.对于数组a,构造一个新的数组C,使得C[i] = a[i-2^k+1] + a[i-2^k+2] + ... + a[i];(1) i >= 1;(2) k为i在二进制表示下末尾的...
阅读全文
摘要: 线段树/区间树是一种非常常用的对区间数据进行操作的数据结构。 线段树是一棵二叉树(但不一定是完全二叉树!),它的每个节点均代表一个区间,且父节点代表的区间为左右子节点代表的区间之和。特别的,根节点代表的区间为所有节点代表区间之和,各个叶节点代表区间为单个点(即长度为1的区间)。
阅读全文
摘要:题目大意一个果树(每个节点的分叉数目不固定)上有N个分叉点(包括最末的叶节点),则有N-1条边,将分叉点进行从1到N编号,每个分叉点上均可以结水果。开始的时候,每个分叉点都有一个水果,之后进行一系列操作,分为两种操作:(1)Q x: 查询分叉点x以及x的子树上的水果的总数;(2)C x: 更改分叉点...
阅读全文
摘要:题目大意在平面上给定n个矩形,可以相互覆盖全部或者部分,求出矩形占据的总面积。题目分析将矩形按照x方向的进行分割之后,将平面沿着y方向划分一系列单元(不定高度),每个矩形在y方向上占据若干连续的单元;在x方向上,将矩形按照x坐标排序之后,考虑有一个扫描线从左到右扫描,当扫描线进入矩形之后,所有矩形在...
阅读全文
摘要:题目大意在墙上贴海报,墙壁是由一排连续的瓷砖铺成,海报贴在墙壁上必须占据连续的几块瓷砖,海报可以互相覆盖,问最后可以看见几张海报(未被完全覆盖)。题目分析墙壁是由连续的一个区间构成,每个海报占据几块瓷砖,即占据一个区间。每次进行贴海报,是进行区间操作,而最后查询有多少个海报可见也是对区间进行查询。对...
阅读全文
摘要:题目大意将一些连续的序列根据颜色分为N段,每段有颜色 为 Ci, 长度为 Li。每次点击其中的一段 i ,则可以将该段i消除,该段相邻的两段自动连接到一起,如果连接到一起的两段之前的颜色相同,则更新该段的长度。消除过程可以得到得分 Li*Li。求当所有的段都消除完毕时的最多得分。分析求最优化问题,典...
阅读全文
摘要:题目大意给定n个数字,规定一种 cute 排序:序列中的数字大小为严格的波浪形,即 a[0] > a[1] a[3] a[2] a[0])的个数;Down[n][i]表示n个数字构成的,以第i大为首的下降序列(a[1] #include#include#includeusing namespa...
阅读全文
摘要:题目大意给定一个由数字组成的#字型网格,和一定的移动规则,问最少需要多少次移动才能达到要求的结果。题目分析要求最少需要几步到达结果,可以考虑广度优先搜索算法,或者迭代加深深度优先搜索(IDA*),这里使用IDA*算法。在剪枝的时候:1. 考虑估价函数H(),表示当前中间八个格子中最少需要移动多少次才...
阅读全文

浙公网安备 33010602011771号