自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 单源最短路径Dijstra算法

Dijstra算法是寻找从某一顶点i出发到大其他顶点的最短路径。Distra算法的思想与Prim算法很像,它收录顶点的规则是按照路径长度递增的顺序收录的。设v0是源顶点,我们要寻找从v0出发到其他任意一点的最短路径。设已经求解的顶点(已经找到从v0出发到达该顶点最短路径的顶点)组成的集合是S={v0,v1,...vk};在收录下一个顶点v的时候要么是(v0,v),要么是(v0,vj,v);如果是后

2016-03-30 23:00:13 1742

原创 hdu1242

这个题目采用BFS,需要注意以下几点:     1)朋友不止一个,只需要找到所有朋友中到达Angle的最小时间。即可以从a出发找最近的r。     2)由于在有x的地方花费时间是2,其他空地是1.这时需要用到优先队列,每次弹出的是时间最短的节点。(以后写BFS还是DFS时需要注意先标记再入栈,如果先入栈,弹出时再标记,可能导致同一个节点入栈多次,以后得注意了。在这个位置老是WA)#

2016-03-27 18:01:23 414

原创 hud1875

1.Prim算法#include#includeusing namespace std;#define MAX_SIZE 102struct Point{ double x, y;};bool visit[MAX_SIZE]; //记录点j是否在树中int Parent[MAX_SIZE]; //记录父节点double LowCost[MAX_S

2016-03-24 20:12:22 356

原创 hdu1102最小生成树

1.使用kruskal算法        题目中给出了一些道路,这些道路将村庄构成了部分连通集。我们要求的是使得整个村庄连通花费最小的道路长度和。实际上就是一个最小生成树问题.。在这里我们已知了给出的一些边(可能不是整个图最小生成树的边,不过这不要紧,只需要接下来我们选择的边长度和最小即可)。在给出的边的集合已经构成了部分连通集,接下来我们将所有的边放在一个最小堆中,每次取出权重最小的边,看边

2016-03-24 11:23:26 754

原创 hdu 1232畅通工程

这是一个比较简单的并查集题目。我们把每一片城区看做一个集合(图的一个连通集),然后统计一共有k个集合,连接两个集合需要1条边,从而整个需要 k-1条边。#includeusing namespace std;#define MAX_SIZE 1000int parent[MAX_SIZE];int findParent(int i);void Union(int i, int j);i

2016-03-23 17:40:16 295

原创 DFS与BFS

1.深度优先搜索(DFS)       深度优先搜索类似于树的先序遍历,是树的先序遍历的推广。在图是连通的情况下,可以从图的任意v一顶点出发,访问该顶点,然后依次从v的没有被访问的邻接点进行同样的深度优先搜索。访问时需要定义一个布尔数组 visite[ i ]来记录第i个顶点是否访问过。递归和非递归代码如下:void DFS(int i){ visit[i] = true; //访

2016-03-22 14:02:40 373

原创 图的存储

1.邻接矩阵     一维数组存储顶点信息,用二维数组存储边信息。空间复杂度为O(n^2),无向图的邻接矩阵一定是对称的,它的第i行或者第i列不为0或者∞的元素个数正好是 顶点 i或者j的度。用邻接矩阵很容易知道两条边之间是否有边相连,而且也很直观简单。但是要确定图中有多少条边的时间复杂度是O(n^2),在存储稀疏图时还会浪费大量的空间,这是邻接矩阵的局限性。2.邻接表    邻接表是

2016-03-21 23:01:06 442

原创 图论基本定义和术语

1.图的定义         图(Graph)是由两个集合构成,一个是非空但是有限的顶点集合V,另一个是描述结合间的关系边的集合E,因此图可以表示为G=(V,E).每条边是一对顶点(v,w)且 v,w∈V.通常|V|和|E|表示顶点个数和边的数量。值得注意的是图中顶点一定不能为空,而边可以为空。 2.图的相关术语       1)无向图:无向图是指图中的边没有方向性即边(v,w)与边(

2016-03-21 20:53:55 12445

原创 hdu3608最长回文子串

首先做这个题目时候以为是动态规划,可惜的是超时了。虽然超时了,但还是先说说动态规划。设原串为s用DP[i,j]表示s[i...j]中最大回文字串的长度,则DP[i,j]的子问题可以划分为DP[i+1,j],DP[i,j-1],以及DP[i+1,j-1].当然还需要一个数组flag[i,j]来记录状态。若flag[i,j]=1,则它表示在 s[i,j]中两个端点字符s[i】与s[j] 是s[i..j

2016-03-20 12:41:26 454

原创 hdu3746 Cyclic Nacklace

看好半天才明白题意。题目大意是说给定一个串,需要在两端加上一些字符,求最少加上多少字符可以使得这个串成为周期循环串。由于要构成环,所以在两端加字符和在一端加其实没什么区别,于是我们只考虑在右端加字符。其实这就是KMP算法中的Next表的应用,所以需要很好的理解Next表格的含义。        先来回顾下Next[j]的含义。设模式串为P[0...m-1],则Next[j]表示P的前缀串P[0

2016-03-20 11:25:53 298

原创 C语言的输入与输出

在提交ACM代码时,C++的输入输出在时间上并不占优势,而C语言的 printf 和 scanf 相对来说效率更高。所以在比赛时,尽量选择使用C语言的输入输出。C语言本身不提供输入输出语句,输入输出操作是C语言标准库的函数来实现的。在C的标准库函数提供了输入输出函数,例如printf函数和scanf函数。它们不是C的关键字,而是库的函数名。     1. printf 函数的一般格式:prin

2016-03-19 21:32:05 2093

原创 KMP算法

KMP算法的全称为:Knuth-Morris-Pratt 。朴素算法效率不高根本原因在于进行了多次重复的比较,没有充分利用已匹配的字符的信息。设文本为T,匹配模式为P;例如:          T : a b a b c d a b b a b a b a d          P  :   a b a b a b a上面模式P与文本匹配,在从开始匹配到字符T[4]!=P[4]时,普通

2016-03-18 11:18:39 484

原创 朴素字符串匹配与Karbin-Karp算法

字符串的精度匹配就是在文本T中找出模式P的精确副本,并求出匹配的位置下标。即如果P[0...m-1]==T[k...k+m-1] ,则称P与T的子序列匹配成功。我们要找出所有匹配成功的k。     朴素字符串匹配方法很简单。从文本T的第一个字母和模式P的第一个字母开始比较。如果不匹配,就从T的第二个字母开始匹配,依次类推,不保留所有有用得信息。设P和T的长度分别为m和n .这

2016-03-17 23:05:37 535

原创 HDU1686

这个题目是字符串匹配算法的入门题。题目如下:OulipoTime Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8961    Accepted Submission(s): 3619Problem Descript

2016-03-17 20:37:53 345

原创 HDU2089 数位DP

原问题是求区间 [ n, m ]中,不含数字4和62的数的总个数.采用的办法是数位 DP。定义数组 dp[i][2],他的含义如下: dp[i][0] : 表示数字最大长度是 i 且不含4和62的数总个数。 dp[i][1] : 表示数字的最大长度是 i 且不含 4 和62,但是最高位是2的数总个数。于是:dp[i][0]=dp[i-1][0]*9-dp[i-1][1];     

2016-03-15 17:51:51 308

原创 HDU 5642 数位DP

对于这种问题,首先要找到一个很好的分类办法。由于最大连续的字母不可以超过3个。于是可以按照字符串最后的字符连续重复的次数分为:最后字符重复1,2,3次这3中情况:定义dp[i][4];     dp[i][1] : 表示长度为 i 的字符串在第 i 个位置重复了 1 次。     dp[i][2] : 表示长度为 i 的字符串在第  i 个位置重复了 2 次。     dp[i][3]

2016-03-15 13:56:37 537

原创 hdu3555 数位DP

     这个题算是数位DP的入门,第一次接触数位DP。自己没有解决出来,参看了好几位大神的博客。直接进入这个问题吧。     首先定义数组DP[i][3],含义如下:     DP[i][0] : 表示最大长度为 i 的数字中不出现 “49”的数字总个数。     DP[i][1]:表示最大长度为 i 的数字中不出现“49”,但是最高位是“9”的数字总个数。     DP

2016-03-14 19:33:19 275

原创 关系模型之关系代数

·1.关系代数式基于集合操作的的一系列关系代数操作:并,差,笛卡尔积,选择,投影,更名,连接。关系代数的输入是多个关系,结果是一个新的关系。关系代数是一种抽象的语言,它是学习其他数据库语言的基础,比如说SQL语言。 2.基于关系代数的操作:并,差,交等必须满足”并相容性“。参与运算的两个关系间的相关属性有一定的对应性。关系R与关系S是“并相容的”当且仅当:           a.R与S的

2016-03-13 21:19:02 1260

原创 约瑟夫问题与变形

1.约瑟夫问题:n个人编号为0...n-1.围成一个圈。从编号为0的人开始顺时针计数,每数到k个人时让其出局(第一次出局的是编号为(k-1)mod n的人),接着又从下一个人开始计数。经过n-1轮报数后,求最终留下的人的编号。     我们只关心最后一个留下的人,比如,当删除第一个人后,也就是删除编号为(k-1)mod n的人,此时我们要求的人就是剩下n-1个人中最后留下的那个人。用F[i

2016-03-12 23:10:42 864

原创 关系模型基本概念

1.关系模型的提出:         关系模型最早是由E.F codd在1970年提出来的。是从表(table)以及表的处理中抽象出来的。是在传统表以及其上面的操作严格化的数学定义上引入“集合理论”与“逻辑学理论“.关系模型是数据库的三大典型模型之一。也是现在大多数商业数据库使用的模型。2.关系模型研究的内容:形象的说,一个关系就是一个Table,而关系模型就是来处理Table的。它描述了

2016-03-11 16:22:15 3710

原创 并查集

在一些有N个元素构成的一些单元素的集合,需要反复查找一个元素在哪一个集合中,判断两个数是否属于同一个集合,以及合并两个集合。并查集是一种树型的数据结构。用于处理不相交的集合( disjoint sets)的合并以及查询问题。在使用时用森林表示。如集合A={0,1,3,6} , B={ 2,4 7} , C={5,8,9}其A,B,C分别构成三棵树,A,B,C共同构成一个森林,并查集一般用数组存

2016-03-10 16:36:47 264

原创 POJ 2503

DescriptionYou have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language. Fortunately, you have a dictionary to help you understand them.

2016-03-09 23:11:20 236

原创 HDU 2557 How to type

Problem DescriptionPirates have finished developing the typing software. He called Cathy to test his typing software. She is good at thinking. After testing for several days, she finds that if she

2016-03-09 14:20:26 355

原创 第二讲 数据库系统结构抽象

1数据库的分层抽象              DBMS管理数据库的三个层次:                          1) External Level  / User Lever .外部层次或者叫用户层次。指的是某一用户能够看到的数据,即全局数据的某一部分。                          2)Conceptual Lever / Logic Lever

2016-03-08 18:28:28 806

原创 完全背包问题

完全背包问题二进制法与转换为01背包问题,还有O(NV)的算法。的特点是每种物品数量没有限制,可以无限使用。很容易定义完全背包状态转移方程,设第i个物品选择k个,于是:

2016-03-06 16:46:46 367

原创 01背包问题

01背包问题描述:给定N个体积为V1....Vn,价值为P1...Pn的物品和一个体积为V的包,求能够装进包中物品的最大价值。为了设计一个动态规划算法,我们需要导出状态转移方程。先考虑原问题的子问题,假设我们考虑前i个问题,背包容积为j,记将前i个物品装到容积为j的包中最大总价值为W[i,j];每个物品只有选择和不选择两种情况,我们根据第i个物品是否选择进行分类。在不包含第i个物品的最优解价值

2016-03-06 14:19:29 427

原创 认识数据库系统

数据库是电子化信息的集合,将信息规范化并电子化,形成电子信息库。以便计算机对这些信息进行快速有效的存储,统计,检索与管理。数据库Database是相互有关联关系的表的集合,每一个表里面数据间有相关关系,表与表之间也有关系。    数据库系统:          1.数据库(DB:Database)          2.数据库管理系统(DBMS : Database Managemen

2016-03-06 12:50:17 1138

原创 动态规划

动态规划(dynamic  programming)与分治法相似,都是通过组合子问题的解来构造原问题的解。不同的是,分治法是将原问题划分为不想交的子问题,而动态规划则应用于子问题重叠的情况。动态规划通常用来求解最优化问题。有的时候最优解有多个。设计一个动态规划算法的步骤:             1.刻画一个最优解的结构特征             2.递归的定义最优解的值     

2016-03-05 21:39:14 276

原创 哈希表应用之字符子串统计

问题描述:给出一个字符串,包含nc中字符,求这个字符串中长度为n的字串(不包括重复的)的数量。题目中假设字串数目不超过16 000 000 个。输入第一行包含两个数字n nc,第二行输入字符串。输出符合要求的子串个数。       输入:               3  4              daababac       输出:              5题目中

2016-03-05 20:31:14 670

原创 统计一篇短文中单词出现频率

散列查找的应用:给定一个英文文本文件,统计文件中所有单词出现的频率。解决这问题最基本的工作是不断地对读入的单词在已有的单词中查找,如果存在就将该单词频数加1,如果不存在就将该单词插入并记录频数为1.下面C++代码的哈希函数使用了双重探测的办法。在确定表的时候是取比输入整数小且距离输入整数最近的素数。#include#include#include#include#includeu

2016-03-05 18:05:02 1139

原创 二叉搜索树基本数据结构实现

二叉搜索树基本数据结构实现,非递归与递归。二叉搜索树中一个结点包含3个指针left,right, prev和一个卫星数据key。这三个指针分别指向左儿子,右儿子,父节点。如果孩子结点和父亲结点不存在,相应指针为空。根结点的prev指向空。     1)遍历(中序遍历,先序遍历,后续遍历)    2)查找一个关键字,返回该关键字的结点指针    3).返回最大关键字最小关键字结点指针    4)寻找关键字key的后继结点

2016-03-04 14:49:37 464

原创 模板编程的文件组合方式

在模板编程时,当你出现error:Link2019,在main中出现无法解析的现象时。       由于模板的实例化发生在第一次使用模板的地方。而实例化是以模板定义的代码来参照的。这样一来就要求模板定义与模板使用同在一个编译单元(源文件)。既然使用模板首先需要模板声明,而且模板定义要求在使用模板同一个编译单位中,因此一般做法是将模板的整个定义都放在头文件内。如果是类模板,需要将类模板定义和成员

2016-03-04 14:35:27 281

原创 散列表

1.直接寻址法:当关键字的全域U很小时,直接寻址法是一种简单而有效的技术。设集合U={0,1,2...m-1},我们用一个数组或叫直接寻址表记为T[0...m-1],数组每一个位置对应U中的一个关键字。T[k]存放关键字K,若集合中没有k关键字则T[k]=NIL;     直接寻址法缺点非常明显:如果全域U非常大,可能就存不下直接寻址表T,如果实际存储关键字太少,也可能造成大量空间的浪费。

2016-03-01 15:05:14 394

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除