数据结构和算法
文章平均质量分 72
Javis486
天下皆白,唯我独黑
展开
-
夕拾算法进阶篇:13)最大连续子序列和(动态规划DP)
题目描述给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 输入测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( K输出对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入原创 2017-02-05 13:20:20 · 468 阅读 · 0 评论 -
夕拾算法进阶篇:8)组合+判断素数(dfs)
题目描述已知 n 个整数b1,b2,…,bn以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34。 现在,要求你计算出和为素数共有多少种。例原创 2017-01-31 09:48:26 · 548 阅读 · 0 评论 -
夕拾算法进阶篇:7)组合的输出(dfs)
题目描述排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r 现要求你不用递归的方法输出所有组合。 例如n = 5 ,r = 3 ,所有组合为: 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 输入一行两个自然数n、r ( 1 输原创 2017-01-28 16:17:11 · 559 阅读 · 0 评论 -
夕拾算法初级篇:8) C语言-数字交换
题目描述输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。输入10个整数输出整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)样例输入2 1 3 4 5 6 7 8 10 9样例输出1 2 3 4 5 6 7 8 9 10 其实这个题原创 2017-01-27 11:46:36 · 612 阅读 · 0 评论 -
夕拾算法进阶篇:1)八皇后问题(递归)
际象棋中:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将n个皇后放在棋盘上(有n * n个方格),使它们谁也不能被吃掉!这就是著名的n皇后问题例如下面是n=5的情况,左图是合法的一个放,而 图是一个不合法的方案对于这个问题,若采用组合数的方式枚举每一种情况(即从n*n个位置中选择n个位置),当n=8时就是54502232次枚举,如果n更大,那么就会无法承受。但换个思路,原创 2017-01-17 22:51:43 · 675 阅读 · 0 评论 -
夕拾算法进阶篇:2)贪心区间
先引入一个问题:给出n个开区间,从中选择尽可能多的开区间,使得这些开区间两两没有交集。例如开区间(1,3)、(2,4)、(3,5)、(6,7),可以选择最多3个区间(1,3)、(3,5)、(6,7),它们互相没有交集。首先考虑下比较简单的情况,如果开区间I1被开区间I2包含,如图a-1所示,显然选择I1是最后的选择,因为如果选择I1,那么就有更大的空间其容纳其他开区间。如果我们把开区间的所有左原创 2017-01-18 16:03:16 · 447 阅读 · 0 评论 -
夕拾算法进阶篇:4)1059. Prime Factors(质因子)
1059. Prime Factors (25)Given any positive integer N, you are supposed to find all of its prime factors, and write them in the format N = p1^k1* p2^k2 *…*pm^km.Input Specification:Each i原创 2017-01-24 09:26:38 · 715 阅读 · 0 评论 -
夕拾算法进阶篇:5)1045. 谁是主元(快速排序)
1045. 快速排序著名的快速排序算法里有一个经典的划分过程:我们通常采用某种方法取一个元素作为主元,通过交换,把比主元小的元素放到它的左边,比主元大的元素放到它的右边。 给定划分后的N个互不相同的正整数的排列,请问有多少个元素可能是划分前选取的主元?例如给定N = 5, 排列是1、3、2、4、5。则:1的左边没有元素,右边的元素都比它大,所以它可能是主元;原创 2017-01-25 17:31:52 · 1386 阅读 · 0 评论 -
夕拾算法进阶篇:6)简单计算器(stack)
题目描述读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。输入测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。输出对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。样例输入30 / 90 - 2原创 2017-01-26 10:42:53 · 401 阅读 · 0 评论 -
夕拾算法进阶篇:22)KMP算法详解(字符串)
之前在数据结构书上面看过KMP算法的介绍,但是一直没有弄懂。发现胡凡的《算法笔记》对该算法的描述非常透彻,因此记录下(ps:下面的图片来自于该书)next数组在正式进入KMP算法之前,先来学习一个重要的数组。假设有一个字符串s(下标从0开始),那么它以ii结尾的子串就是s[0..i],对于该子串来说,长度为k+1的前缀和后缀分别是s[0..k]和s[i-k..i],现在定义一个数组next原创 2017-02-16 09:17:43 · 459 阅读 · 0 评论 -
夕拾算法进阶篇:28)矩阵连乘(动态规划DP)
#include #include #include using namespace std;const int Inf=0x7fffffff;const int M=105;int dp[M][M],p[M]; int main(){ int i,j,n,v,k; while(cin>>n){ for(i=0;i<n;i++){ cin>>p[i]; }原创 2017-02-22 18:32:05 · 1063 阅读 · 0 评论 -
夕拾算法进阶篇:27)并查集
并查集是一种维护集合的数据结构,它的名字中“并“ ”查“ ”集”分别取自Union(合并)、find(查找)、Set(集合)这3个单词。也就是说,并查集支持下面两个操作:(1)合并:合并集合。(2)查找:判定两个元素是否在一个集合。那么并查集怎么定义呢?其实就是一个数组:int father[N];其中father[i]就表示元素i的父结点,而父节点本身也是集合中的元素。例如fat原创 2017-02-21 12:18:11 · 414 阅读 · 0 评论 -
夕拾算基础阶篇:9)C++字符串输入流sstream(字符串)
//在字符串v中把v3全部替换成v2 string replaceAll(string v,const string &v2,const string &v3){ int pos,len2=v2.length(); while((pos=v.find(v2))!=-1){ v=v.replace(pos,len2,v3); } return v;}//把字符串s按照字符串c进行原创 2017-02-23 09:31:04 · 1327 阅读 · 0 评论 -
夕拾算法进阶篇:9)走迷宫(dfs)
问题描述 有一个n*m格的迷宫(表示有n行、m列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这n*m个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-l表示无路)。 请统一用 左上右原创 2017-02-01 13:53:32 · 589 阅读 · 0 评论 -
夕拾算法进阶篇:33)最短路径Floyd(图论)
Floyd(佛洛依德,和著名心理心理学家同名)算法用来解决全源最短路问题,即给定图G(V,E),求任意两顶点的最短路径长度,时间复杂度O(n^3)。Floyd非常适合使用邻接矩阵来实现,但总的顶点数n限制在200以内。Floyd基于这样一个事实:如果存在顶点k,使得以k作为中介点是顶点i和顶点j的当前最短距离缩短,则使用顶点k作为顶点i和顶点j的中介点,即当dis[i][k]+dis[k][j原创 2017-02-28 11:00:46 · 628 阅读 · 0 评论 -
夕拾算法进阶篇:37)二分答案
二分答案和二分查找类似(与其说类似,还不如说照葫芦画瓢),都是在顺序查找的基础上使用二分提高了效率。和二分查找一样(需要原序列有序),二分答案也有其前提:(1)答案区间上下限确定,即最终答案在哪个范围是容易知道的。(2)检验某值是否可行是个简单活,即给你个值,你能很容易的判断是不是符合题目要求。(3)可行解满足区间单调性,即若x是可行解,则在答案区间内x+1(也可能是x-1)也可行。原创 2017-03-17 10:54:49 · 454 阅读 · 0 评论 -
夕拾算法进阶篇:36)拓扑排序(图论)
如果一个有向图的任意顶点都无法通过有向边回到自身,那么称这个有向图为有向无环图(Directed Acyclic Graph)。拓扑排序就是将DAG图的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u、v,如果存在边u->v,那么在序列中u一定就在v前面。这个序列又被称为拓扑序列。原创 2017-03-04 23:13:01 · 643 阅读 · 0 评论 -
夕拾算法进阶篇:10)打印出栈序列&出栈序列是否合法(stack)
打印出栈序列题目要求很简单,给出给出入栈的序列1,2,3....n,然后打印所有可能的出栈序列。入栈序列为:1 2 3出栈的序列:3 2 1 2 3 1 2 1 3 1 3 2 1 2 3其实本质上还是DFS的搜索思想,在入栈和出栈之间做出选择。分析大致如下:给出的序列有n个,入栈操作n次,出栈操作n次。入栈次数小于n的时候可入栈,栈不为空原创 2017-02-02 09:48:52 · 528 阅读 · 0 评论 -
夕拾算法进阶篇:38)欧拉回路(图论)
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次,称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。(1)判断欧拉路是否存在的方法有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。(3)判断欧拉回路是否存在的方法有原创 2017-03-18 16:04:44 · 558 阅读 · 0 评论 -
夕拾算法进阶篇:31)最短路径Dijkstra(图论)
Dijkstra(迪杰斯特拉)算法,用来解决单源最短路问题,即给定图G和起点s,通过算法得到s到其他每个顶点的最短距离。Dijkstra的策略:(1)记V为图的所有顶点集合,S为已访问过的顶点集合。每次从集合V-S(即为访问的顶点)中选择一个与起点s的最短距离最小的一个顶点(记为u),访问并加入集合S。(2)之后,令u为中介点,优化起点与所有从u能到达的顶点v之间的最短距离。D原创 2017-02-26 10:44:10 · 641 阅读 · 0 评论 -
夕拾-数据结构-计数排序
计数排序和基数排序,名称虽然相似,但是原理完全不一样。计数排序比较适用于元素偏小的序列,比如元素在1000之内,排序速度还是比较快的。时间复杂度为O(n)。基本思想:假设数序列中小于元素a的个数为n,则直接把a放到第n个位置上。当存在几个相同的元素时要做适当的调整,因为不能把所有的元素放到同一个位置上。计数排序假设输入的元素都是0到Max之间的整数。假设给定的数组元素a[i]都在100之内原创 2017-02-11 13:24:46 · 463 阅读 · 0 评论 -
夕拾算法进阶篇:30)三维BFS广度搜索(图论)
之前介绍过二维广度搜索以及如何求解当前坐标的相邻坐标,现在把问题延伸到三维,并且也只能向相邻的位置(前,后,上,下,左,右)移动如何求当前坐标(x,y,z)的下一个坐标?其实很简单三维无法就多了一个前后。可以先固定前后的方向(假设为z轴),此时只有在上下左右(xy轴)方向移动,这和二维无异;然后再固定xy轴,只在z轴上移动。//定义方向依次是前,后,上,下,左,右 int dir[6][3]原创 2017-02-25 10:34:26 · 736 阅读 · 0 评论 -
夕拾算法进阶篇:12)出栈序列统计(动态规划DP)
题目描述栈是常用的一种数据结构,有n令元素在栈顶端一侧等待进栈,栈顶端另一侧是出栈序列。你已经知道栈的操作有两•种:push和pop,前者是将一个元素进栈,后者是将栈顶元素弹出。现在要使用这两种操作,由一个操作序列可以得到一系列的输出序列。请你编程求出对于给定的n,计算并输出由操作数序列1,2,…,n,经过一系列操作可能得到的输出序列总数。 输入一个整数n(1输出一个整原创 2017-02-04 11:26:26 · 960 阅读 · 0 评论 -
夕拾算法进阶篇:29)深度搜索和广度搜索(图论)
在介绍两种搜索之前,先复习下图的两种存储方式图的存储邻接矩阵设图G(V,E)的顶点为0,1...n-1,那么可以令二维数组G[N][N]的两维分别表示图的顶点编号,即如果G[i][j]为1,说明顶点i和顶点j之间有边;如果G[i][j]为0,则说明顶点i和顶点j之间不存在边,而这个二维数组G则被称为邻接矩阵。另外如果存在边权,则可以令G[i][j]存放边权,对不存在的边可以设边原创 2017-02-24 09:38:18 · 653 阅读 · 0 评论 -
夕拾算法进阶篇:35)最小生成树Kruskal(图论)
Kruskal(克鲁斯卡尔)算法,同样是解决最小生成树问题的一个算法。和Prim不同,Kruskal采取的是边贪心的策略,其思想如下:原创 2017-03-03 11:29:02 · 539 阅读 · 0 评论 -
夕拾算法进阶篇:34)最小生成树Prim(图论)
Prim算法解决的是最小生成树问题,即在给定的无向图G(V,E)中求一棵生产树T,使得这棵树拥有图G的所有顶点,且所有边都是来自图G中的边,并且满足整棵树的边权之和最小。Prim的基本思想(1)对图G(V,E)设置集合S存放已经被访问的顶点(记为u),访问u并把u加入集合s中,同时把这条离集合S最近的边加入到最小生成树中。(2)令顶点u作为集合S和集合V-S连接的接口 ,优化从u能到达原创 2017-03-02 20:17:11 · 455 阅读 · 0 评论 -
夕拾算法进阶篇:20)货币系统 (完全背包_动态规划DP)
题目描述母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统。,他们对货币的数值感到好奇。传统地,一个货币系统是由1,5,10,20 或 25,50, 和 100的单位面值组成的。母牛想知道有多少种不同的方法来用货币系统中的货币来构造一个确定的数值。举例来说, 使用一个货币系统 {1,2,5,10,...}产生 18单位面值的一些可能的方法是:18x1, 9x2, 8x2+2x1,原创 2017-02-12 10:16:14 · 1348 阅读 · 1 评论 -
夕拾算法进阶篇:26)哈夫曼树及其编码
#include using namespace std;const int M=100;const int Inf=0x7fffffff;bool code[M];//保存01编码 int ans=0; //保存最小带权路径长度 //树结构定义 struct Node{ int weight; //输入字符的权重 char ch; //保存输入的字符 Node *l原创 2017-02-20 15:01:26 · 614 阅读 · 0 评论 -
夕拾算法初级篇:2)1032. 挖掘机技术哪家强
1032. 挖掘机技术哪家强为了用事实说明挖掘机技术到底哪家强,PAT组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。输入格式:输入在第1行给出不超过105的正整数N,即参赛人数。随后N行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从1开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。输出格式:在一行中给出总得原创 2017-01-10 13:37:18 · 387 阅读 · 0 评论 -
夕拾算法初级篇:7)Two Pointer
Two Pointers 双指针问题,以一个例子引入:给定一个原创 2017-01-14 10:10:20 · 564 阅读 · 0 评论 -
夕拾算法初级篇:6)1023. 组个最小数(贪心)
1023. 组个最小数给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)。例如:给定两个0,两个1,三个5,一个8,我们得到的最小的数就是10015558。现给定数字,请编写程序输出能够组成的最小的数。输入格式:每个输入包含1个测试用例。每个测试用例在一行中给出10个非负整数,顺序表示我们原创 2017-01-13 15:52:19 · 363 阅读 · 0 评论 -
夕拾算法初级篇:5)1020. 月饼(贪心)
1020. 月饼 (25)月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、72、45亿元。如果市场的最大需求量只有20万吨,那么我原创 2017-01-13 15:51:45 · 700 阅读 · 0 评论 -
夕拾算法初级篇:1)1001. 害死人不偿命的(3n+1)猜想
1001. 害死人不偿命的(3n+1)猜想 (15)时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard作者CHEN, Yue卡拉兹(Callatz)猜想:对任何一个自然数n,如果它是偶数,那么把它砍掉一原创 2017-01-08 21:10:33 · 516 阅读 · 0 评论 -
算法杂项:快速判定素数(素数表)
问题描述,判断一个数x是否为素数?传统思维:对于数n,从i=2,3,4,5…到 n-1 判断 n能否被i整除,如果全部不能整除,则n是素数,只要有一个能除尽,则n不是素数;事实上,为了压缩循环次数,可将判断范围从2 ~ n-1改为2 ~ sqrt(n)但是我们如果要打印一个比较大的素数表呢?比如打印前2000000的素数,此时选用筛选法就显得非常方便。先看下筛选法思想:原创 2017-01-01 10:13:54 · 1271 阅读 · 0 评论 -
算法杂项:n进制转十进制
该方法教适合于字符串转整型,方法貌似在初中是学过,但忘了,比如1234=((1*10+2)*10+3)*10+4下面的代码在n#includeusing namespace std;long ToTenHex(string value,int n) { long result=0; for(int i=0;value[i];i++) { result=resu原创 2015-09-09 22:45:08 · 767 阅读 · 3 评论 -
夕拾-数据结构:树的应用-排列和组合
树的简单应用,代码如下,看注释即可#includeusing namespace std;int a[100]; //保存树节点的值bool used[100]; //树节点是否被使用过 //1-n的排列 n为数的总层次 cur为当前的层次 void DfsArray(int n,int cur){ if(cur<n) { for(int i=1;i<=n;i++)原创 2015-09-09 22:30:17 · 644 阅读 · 0 评论 -
夕拾-数据结构-选择&堆排序
1.选择排序记得以前吾最爱的就是选择排序,因为它最容易理解:从当前元素的后面选择一个最小的元素与之交换void SelectionSort(int a[],int n){ int i,j,min; //min记录比当前元素小的下标 for(i=0;i<n-1;i++) { min=i; for(j=i+1;j<n;j++) { if(a[min...原创 2015-10-10 22:12:41 · 537 阅读 · 0 评论 -
夕拾-数据结构-直接插入&希尔排序
直接插入排序具体思想:1.选定从第2个元素开始,当前的元素依次与前面的元素做比较2.若当前的元素小于前面的元素,则前面的那个元素赋值给它后面的那个元素(a[i+1]=a[i]),为此腾出位置4.若当前的元素不小于前面的元素,则直接插入即可//下标从0开始的直接插入排序 void InsertSort(int a[],int n){ int i,j,cur;//cur当前要插...原创 2015-10-03 20:12:18 · 631 阅读 · 0 评论 -
夕拾-数据结构-冒泡排序
冒泡排序亦算得上比较经典的排序(快速排序就是其演进)以小元素上浮为例:序列从后往前扫描,若当前元素小于前一个元素则交互位置。一次遍历后,最小的元素则浮了上来、下次只需扫描除该元素的序列即可,循环n-1次即可得有序序列void BublbeUp(int a[],int n){ for(int i=0;i<n-1;i++) { bool flag=false;//跳出循环的标原创 2015-09-30 22:54:07 · 627 阅读 · 0 评论 -
夕拾算法进阶篇:14)最长上升子序列(动态规划DP)
题目描述一个数列ai如果满足条件a1 现在你要写一个程序,从给出的数列中找到它的最长上升子序列。输入输入包含两行,第一行只有一个整数N(1 第二行有N个自然数ai,0 输出输出只有一行,包含一个整数,表示最长上升子序列的长度。样例输入71 7 3 5 9 4 8样例输出4这个题目和最大连续子序列类似,例如有序列A={1,2原创 2017-02-06 11:07:01 · 429 阅读 · 0 评论