编程练习ACM
DanielWang_
对开源、NLP、网络编程等领域感兴趣 共同学习~~ best wishes
展开
-
欧几里德算法及扩展欧几里德 中科大 ACM 1209
欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数。其计算原理依赖于下面的定理: 定理:gcd(a,b) = gcd(b,a mod b) 证明:a可以表示成a = kb + r,则r = a mod b 假设d是a,b的一个公约数,则有 d|a, d|b,而r = a - kb,因此d|r 因此d是(b,a mod b)的公约数 假设d 是(原创 2012-12-08 19:17:18 · 2581 阅读 · 0 评论 -
并查集及 编程练习
并查集概念:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。比如典型应用:实现Kruskar算法求最小生成树。并查集的主要操作 :下面举例说明并查集的常用的三种操作:1、make_set(x) 把每一个元素初始化为一个集合初始化后每一个元素的原创 2013-12-17 19:42:17 · 2102 阅读 · 0 评论 -
线段树
线段树(Segment Tree)是一种二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+b)/2],右子树表示的区间为[(a+b)/2+1,b]。因此线段 树是平衡二叉树。叶节点数目为N,即整个线段区间的长度。使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(原创 2013-10-19 16:59:21 · 1707 阅读 · 0 评论 -
回溯法 求集合全排列、子集
回溯法,参见之前的blog。全排列:全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理,从而得到所有元素的全排列。以对字符串abc进行全排列为例,我们可以这么做:以abc为例固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac固定b,求原创 2013-11-30 17:43:08 · 7009 阅读 · 0 评论 -
后缀数组及其应用
后缀数组概念基本概念介绍:子串:字符串 S 的子串 r[i..j] , i ≤ j ,表示 r 串中从 i 到 j 这一段,就是顺次排列 r[i],r[i+1],...,r[j] 形成的字符串。后缀:从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串 r 的从 第 i 个字符开始的后缀表示为 suffix(i) ,也就是suffix(i)=r[i..len(r)] 。原创 2013-12-31 17:07:54 · 2806 阅读 · 0 评论 -
整形数组中只出现一次的数字(剑指Offer,九度OJ)
题目链接:http://ac.jobdu.com/problem.php?pid=1351 ,剑指Offer P211。题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。解题思路:看到这个题的时候,大家通常会利用比较普通的解法,先对数组排序,然后再遍历一篇,但是题目要求时原创 2013-11-26 17:14:28 · 1924 阅读 · 0 评论 -
杭电OJ 1251 、1671(字典树)
杭电OJ 1251题目传送门:1251 统计难题:http://acm.hdu.edu.cn/showproblem.php?pid=12511671,Phone List: http://acm.hdu.edu.cn/showproblem.php?pid=1671用标准的Trie树即可解决。字典树单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。原创 2013-10-19 16:55:03 · 1787 阅读 · 0 评论 -
HDOJ 1711 (用KMP解决)
hdoj 1711 Number Sequence: http://acm.hdu.edu.cn/showproblem.php?pid=1711此题利用KMP算法即可解决。状态转移图的构造是KMP算法的关键,算法的思想是“用自己匹配自己”根据f[0], f[1],f[2],f[3],...f[i-1] 递推f[i] 。注意审题,刚开始数组开小了,一直报错 wrong ans原创 2013-10-19 16:56:41 · 1671 阅读 · 0 评论 -
编程求幻方(魔方),1-N
题目来源:2013.11.28 带的程序设计 I 上机(即大一C语言课程)。题目描述:有一种正方形的数字排列是一个5×5的数字幻方,即每个1到5的整数在每行每列都出现且出现一次。形式如下:1 2 3 4 52 1 4 5 33 4 5 1 24 5 2 3 15 3 1 2 4对于一个N×N的幻方,如果我们固定了第一行如下:1 2 3 4 5...N我们可以算出符合原创 2013-11-29 22:30:43 · 4556 阅读 · 0 评论 -
算法-- 回溯算法 及 示例
回溯法介绍回溯法(英语:backtracking)也称试探法,回溯法有“通用的解题方法”之称。它可以系统的搜索一个问题的所有解或者任意解。回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子原创 2013-11-30 16:09:46 · 9056 阅读 · 0 评论 -
字符串最小周期串问题
问题描述:如果一个字符串可以由某个长度为n的字符串重复多次得到,则该串以n为周期。例如,abcabcabcabc以3为周期(注意,它也以6和12为周期)。输入一个长度不超过100的串,输出它的最小周期。样例输入:ChinaChinaChina样例输出:5问题分析:字符串可能有多个周期,但是只需求出最小的一个。可以从小到大枚举各个周期(即从1到字符串大小),一旦符合条件就原创 2013-11-26 11:05:04 · 6785 阅读 · 4 评论 -
leetcode Combination Sum 使用集合中的元素求和得到目标值
http://oj.leetcode.com/problems/combination-sum/题目:Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.原创 2013-10-29 19:50:40 · 1846 阅读 · 0 评论 -
动态规划 LCS 求两个序列A,B中所有的最长公共子序列
动态规划 求两个序列A,B中所有的最长公共子序列 第一部分、什么是动态规划算法 动态规划一般也只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。动态规划算法分以下4个步骤:1,描述最优解的结构2,递归定义最优解的值3,按自底向上的方原创 2013-10-22 21:18:17 · 6201 阅读 · 1 评论 -
最长递增子序列(LIS)求解
问题描述最长递增子序列也称 “最长上升子序列”,简称LIS ( longest increasing subsequence)。设L=是n个不同的实数的序列,L的递增子序列是这样一个子序列Lis=,其中k1如:求一个一维数组arr[i]中的最长递增子序列的长度,如在序列{ 7, 1, 6, 5, 3, 4, 8 }中,最长递增子序列长度为4,其递增子序列为:1,3,4,8。原创 2014-05-13 11:33:12 · 4937 阅读 · 0 评论