![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 78
dzyhenry
Do one thing do it good.
展开
-
HDOJ 1069 Banana and Monkey
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1069 题目大意:求摞砖块的最大高度?已知长宽高的n种砖块,每种砖块的选取数量不限,砖块可以以其任意面堆叠,即:长宽高各不同的砖块相当于三个砖块。但要求放在下面的砖块的面积必须比上面的砖块面积大,并且下面的砖块的长和宽必须大于堆在其上面的砖块。题意分析:根据题意,求这些砖块在题意的限制(0、原创 2013-05-25 20:25:49 · 1656 阅读 · 0 评论 -
分治法求整数序列的逆序数
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。 求逆序数的方法很多。最容易想到的办法是分别对序列中每一个元素求其逆序数,再求所有元素的逆序数总和,易分析得出这样的方法其时间复杂度为O(n2)。 这里介绍一种分治的方法求逆序数,其思路如下。 我们知道在对序列进行原创 2013-02-02 20:57:02 · 5471 阅读 · 0 评论 -
教室课程调度问题的两种解法(区间着色问题)
问题描述:假如要用很多个教室对一组课程进行调度,每节课程都有其开始时间和结束时间,我们希望使用尽量少的时间来调度所有的课程,请给出调度算法? 分析: 1、利用贪心算法来解决这个问题。 1)将课程按照其结束时间的先后顺序排序。 2)设课程集合为C,我们可以利用贪心算法先求出初始课程集合C的一个最大兼容课程子集C1(C原创 2012-11-16 23:44:45 · 2042 阅读 · 0 评论 -
Longest Common Sequence Algorithm(最长公序列算法)
问题描述: 在最长公共子序列问题中,给定了两个序列 X=和Y=,希望找出X和Y的最大长度公共子序列。 LCS是动态规划算法中比较经典的问题。 1、构造LCS的最优子结构: 设X=和Y=为两个序列,并设Z=为X何Y的任意一个LCS。 1)如果Xm = Yn,那么Zk=Xm=Yn而且Zk-1是原创 2012-11-11 22:19:13 · 1265 阅读 · 0 评论 -
杭电ACM 1015 很笨的暴力解法
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1015#include#include#includeint comp(const void *a, const void *b){ return *(int*)b-*(int*)a;}int main(){ int n; char s1[13]; int a[原创 2013-04-01 21:05:09 · 1426 阅读 · 1 评论 -
HDOJ 1074 Doing Homework
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:题意分析:1、根据题意,我们需求所有课程的全排列情况的被罚分数,再从中选取最小的一种排列。虽然课程最多只有15门,但总共有15!种情况,这样做肯定会超时。2、通过观察我们发现:假如我们把课程的选择当成一种状态的转移,初态时选择了零门课程,终态时所有课程选择完毕。则,原创 2013-05-31 19:58:28 · 1255 阅读 · 0 评论 -
HDOJ 1063 Exponentiation
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1063 题目大意:求R(0.0 分析题意:此题一看便知道是关于大数乘法的问题,属于比较常见的问题。我的解题思路是这样的:先将浮点数乘法转化为正整数乘法,然后再加小数点1、 将输入的R从浮点数转换成正整数,并记录下小数位数。2、 于是此题就转变为大数整数乘法,大数整数乘原创 2013-04-29 22:32:03 · 856 阅读 · 0 评论 -
HDOJ 1006 Tick and Tick
这道题比较自己看到后比较迷茫,在网上搜了下,发现大部分都是直接给出代码,具体解题思路不容易一下看明白,自己花了些时间,将思路整理了下。题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1006 这道题目需要求时针、分针、秒针之间的间隔区间大于某个角度(这个角度由用户输入)的总时间占一天之中总时间的比例。可以这样理解:1、原创 2013-03-29 00:42:19 · 1933 阅读 · 0 评论 -
Matrxi Chain Order(矩阵链乘法问题)
一、问题介绍: 给定由n个要相乘的矩阵构成的序列(链),要计算乘积: A1, A2...An 一组矩阵的乘积是加全括号的(fully parenthesized),如果它是单个矩阵,或是两个加全括号的矩阵的乘积外加括号而成。矩阵的乘法满足乘法的结合律,故无论怎样加括号都会产生相同的结果。但加括号的原创 2012-11-12 12:54:08 · 1079 阅读 · 0 评论 -
通过八数码问题学习A*算法
前言:在网上看了很多有关A*算法的资料,不少文章讲得很详细,分析得很透彻,但仅仅阅读网上的资料,我总觉得这样的学习过程过于肤浅,于是自己实现了一个A*算法比较经典的问题,即文章标题所讲的八数码问题。 问题描述:八数码问题,实际就是在一个3X3的九宫格内,其中一个格子为空,其余八个格子分别用1-8的数字填充,这八个数字在九宫格内所占格子的位置可以任意。我们所求就是在两种占位置的情况原创 2012-11-22 00:13:31 · 1220 阅读 · 0 评论 -
01Knapsack(01背包问题)
01背包问题是个老生常谈的关于动态规划的问题。 首先问题描述:给定n个物品,每个物品的重量是wi,每个物品的价值是pi,背包的最大容量是M,求如何装入这些物品才能使背包里的价值量最大? 分析: 假定我们没选择一个物品就是一次决定,0表示不选择这个物品,1表示选择这个物品(这也是01背包问题的来源)。当我们在做第i步决定的时候,我们需要考虑的是在第i-原创 2012-11-14 16:48:16 · 1771 阅读 · 0 评论 -
C语言实现快排、归并排序、快排改进算法的递归和非递归算法
其实以上算法的原理都很简单。在本科阶段,我们对这几个算法的基本原理都应该十分熟悉,但对于我,真正落实到是实现这几算法,之前几乎没有试过。现在刚上研一,算法课的第一次作业中,要求我们将这几个算法实现,对这几个算法,在输入规模不同的情况下,比较其实际工作效率。 由于自己对算法具体的实现动手能力存在问题,就这几个算法的具体实现都花了我将近两天的时间。下面是源码:这是定义原创 2012-11-01 19:43:37 · 4335 阅读 · 0 评论 -
输入阿拉伯数字(整数),输出对应的中文(美团网2014年9月16日笔试题目之一)
2014年9月16日,美团网南京笔试题之一。原要求是输入整数的位数最多为四位,这里扩展为12为,即最高到前一级别。思路及步骤:1 判别输入是否合法,并过滤字符串最前面的‘0’。2 将字符串划分成四位一组的形式,其中每一组四位整数的输出方式相同。如20402040,其前四位和后四位都是2040,都输出“二千零四十”,只不过前四位要添上‘万’字而已。3 将8~12位、4~8位、0~4位原创 2014-09-17 15:07:18 · 3141 阅读 · 0 评论 -
C++实现二叉树的前序、中序、后序非递归扁历
这三种常见的扁历方式,是考研面试等场合经常遇到的,在此做一个总结。1、前序遍历比较简单:用指针p指向根节点,若p!=NULL且栈非空,则直接访问节点,并将节点的右孩子入栈,同时指针p向左孩子移动。2、中序扁历:用指针p指向根节点,若p!=NULL且栈非空,则当前节点入栈,同时指针p向左孩子移动,出栈是指针指向当前节点的右孩子。3、后序扁历相对复杂:需要设置一个辅助栈,标识该节点是否是第原创 2014-09-09 16:31:31 · 1040 阅读 · 0 评论 -
C++模板类实现“堆”的经典案例学习+(优先队列)
本文转自:《C++程序设计》 Y. Daniel Liang著 王刚,刘晓光,刘璟 译, 机械工业出版社 简单介绍堆的概念:堆,实际上就是一颗完全二叉树,它的每个节点的值都大于等于其任何孩子节点的值。 堆是二叉树,因此可用二叉树的结构描述,但是,如果堆的大小预先可知的话,更为有效的描述方法是使用向量或数组。下面的代码使用的向量原创 2013-04-12 15:24:05 · 1102 阅读 · 0 评论 -
HDOJ 1025 最长递增字串
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1025题目大意:有两行按编号升序排列的城市,相对的城市希望彼此修筑道路,且互相修路的配对是事先安排好的,要求所修的道路两两不相交,问最多能修多少条道路? 分析题意:1、显然,可以根据配对,先将一边的(poorcities)城市按从小到大的顺序排列,按次顺序,然后求另一边的城市(rich原创 2013-04-25 18:24:37 · 1018 阅读 · 0 评论 -
HDOJ 1045 Fire Net
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045题目大意:对于一个迷宫,其中’X’ 表示wall,‘.’表示空地,可以放置blockhouse,同一条直线上只能有一个blockhouse,除非有wall隔开,问在给出的图中最多能放置多少个blockhouse。 分析题意:1、 此题有两种解法。第一种:暴力解法。从左往右,从上到原创 2013-04-26 21:59:26 · 679 阅读 · 0 评论 -
求两个等长升序序列中每个序列取一个元素求和的第K小元素
已知两个等长的升序整数序列{a1, a2, ..., ak}和{b1, b2, ..., bk},求序列{ai+bj}的前k小元素,其中1≤i≤k且1≤j≤k,要求时间复杂度尽可能低。 思路:将(1,1,a[1]+b[1])加入一个小根堆 while (堆非空且出堆的元素总数少于k个){原创 2012-11-01 20:05:41 · 1629 阅读 · 0 评论 -
计算编辑距离的算法
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 下面是用c++实现的该算法: 文件:"Distance.h"#ifndef DISTANCE_H#define DISTANCE_H#i原创 2012-11-01 19:59:42 · 1011 阅读 · 0 评论 -
HDOJ 1072 Nightmare
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072 题目大意:判断是否能走出迷宫,若不能走出,输出-1,若能走出,求走出迷宫的步数?如果没有走到重置的点,一次最多走5步(迷宫中:0表示wall;1表示空白;2表示起点;3表示出口;4表示可以重置步数为6). 题意分析:1、本题属于常见的搜索题,可采用广度优先搜索。2、但,本原创 2013-05-29 18:41:01 · 735 阅读 · 0 评论 -
大数加减法总结
大数加减法总结(包括整数或者负数):1、先解决不带符号的数的加减法2、根据加数或者减数的符号位判断该选择加法还是减法计算,并且赋予结果对应的符号需要注意的是:不带符号的减法产生的结果可能高位为‘0’,要进行处理。string bigNumberMinusWithoutSign(const char* num1, const char *num2){ string res =原创 2014-10-20 00:22:50 · 3172 阅读 · 0 评论 -
HDOJ 1059 Dividing
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1059 题目大意:有6种marbles,其价值分别为1…6,每种marbles有一定的数量,请问是否可以将这些marbles分成两部分,每部分的价值总量相等,即等于所有marbles的总价值的一半。 题意分析:我们可以考虑用01背包或者多重背包的问题解决。至于01背包和多重背包问题,可参原创 2013-05-04 14:36:13 · 667 阅读 · 0 评论 -
背包(01背包、完全背包、多重背包)问题总结
以前也写过01背包问题的博文,但理解并不深刻,前几天在做HDOJ1059这道题的时候,在网上搜了下,原来背包问题远不止01背包问题那么简单,当然,01背包问题是基础。于是参考了网上非常经典的一篇文章:http://love-oriented.com/pack/#sec5问题定义:先看一看比较经典的三个背包问题的问题原型。 01背包问题: 有N个物原创 2013-05-04 14:03:05 · 1499 阅读 · 0 评论 -
判断ip地址是否合法
下面是一个判断ip地址是否合法的算法: #include bool IsDigit(char Digit){ bool Flag = false; if(Digit >= '0' && Digit <= '9') { Flag = true; } return Flag;}bool IsFormatValid(char I原创 2012-11-01 19:56:19 · 8543 阅读 · 1 评论 -
乐视TV2015校园招聘A卷第二大题(中国科学院大学站)
题目描述:给定数组A,大小为n,数组元素为1到n的数字,不过有的数字出现了多次,有的数字没有出现。请设计算法和程序,统计哪些数字没有出现,哪些数字出现了多少次。能够在O(n)的时间复杂度,O(1)的空间复杂度要求下完成么?(思路和代码)参考:http://mp.weixin.qq.com/s?__biz=MjM5ODIzNDQ3Mw==&mid=200446711&idx=1&sn=0原创 2014-09-30 14:55:52 · 1803 阅读 · 0 评论 -
HDOJ 1053 Entropy
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1053 题目大意:求输入的字符串的霍夫曼编码的编码效率。题意分析:此题思路比较简单,基本原理就是大学数据结构中的霍夫曼编码的实现:把给每个字符在字符串中出现的次数作为该字符的权值,然后建立二叉树存储该字符,权值越小,在二叉树中的深度越深,权值越大,在二叉树中的深度越浅。方法就是: 1原创 2013-05-05 20:57:19 · 954 阅读 · 0 评论 -
HDOJ 1044 Collecting More Jewels
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1044此题系BFS和DFS的结合使用,需要理解BFS和DFS的特点。BFS:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费较大,需要开辟大量的数组单元来存储状态。DFS:对于解决遍历和求所有问题有效,对于问题搜索深度小的时候处理迅速,然而在深度很大的情况下效率不高。原创 2013-04-25 09:07:30 · 962 阅读 · 0 评论 -
HDOJ 1011 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1011由于一开始没理解到题意,这道题纠结了很久。所以先通俗地讲讲题意吧。1、首先,此题的cavern(大山洞)实际上一棵树。树上的每个节点(room)有一定数量的bugs和brains。树上的节点是联通的,n个节点有n-1个隧道。2、作为startrooper的leader的你,将带领你的部原创 2013-04-23 18:01:20 · 1475 阅读 · 0 评论 -
HDOJ 1023 卡特兰数
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1023参考文章:http://baike.baidu.com/view/2499752.htm?fromId=1163998 http://hi.baidu.com/dybivzbhnucdxzr/item/d48bb01d6c3d644ce65e0607原创 2013-04-04 17:30:31 · 1388 阅读 · 0 评论 -
整数数组的组合问题
2015年9月16日,美团南京站南京邮电大学笔试题目之一。大致的题意是这样的:有一个元素各不相同的整数数组,输入元素的所有组合,长度由大到小。例如:[1, 2, 3, 4],依次输出1234,123,134,234,12,13,14,23,24,1,2,3,4思路:1、设输出的组合的长度为m(m2、把数组分为两个部分:第一个数和后面的m-1个数3、如果组合里包含第一原创 2014-09-17 16:57:52 · 1474 阅读 · 0 评论 -
图的基本算法
整理了一下图的基本算法,包括图的深度优先遍历、广度优先遍历、拓扑排序、三种单源最短路径(Bell-Ford、Dijkstra、有向无回路最短路径算法)、关键路径。 图的存储结构采用的邻接表。 这里贴出算法的关键部分,具体的实现已经上传到我的资源上了。 ”graphOperation.cpp“原创 2012-12-11 10:00:33 · 1023 阅读 · 2 评论