- 博客(31)
- 资源 (15)
- 收藏
- 关注
原创 Java synchronized参数的讨论
/** * synchronize关键字参数测试类 * synchronized关键字参数必须是多个线程共享的变量,才能达到同步目的 * 例如: * 1. 如果用了类里面的一个属性object作为锁,由于这个属性 * 每一个实例化对象都有一份,所以运行发现3个线程都没有同步 * 2. 如果用了类对象的class对象或者是类的静态属性作为锁, * 由于这个对象是类共享的,所以同一个My
2016-11-22 17:23:03
5770
原创 Struts,Spring,Hibernate源代码下载地址
Struts:http://archive.apache.org/dist/struts/source/?C=M;O=ASpring:https://github.com/spring-projects/spring-framework/releasesHibernate:https://sourceforge.net/projects/hibernate/files/hibernate4
2016-08-16 17:30:47
563
原创 Java-时间复杂度为O(nlogn)的排序算法(快速排序, 归并排序, 堆排序, 希尔排序)
/** 包含多种静态排序方法 * Created by Andre on 2016/6/27. */public class Sorter { /** * 快速排序 * 递归形式 * 第一个记录为枢轴 * 不稳定 * @param a 需要排序的数组 * @param low 数组的起始下标 * @param h
2016-06-29 22:42:30
1703
原创 hdu5399
根据题意可知,要满足题意给的那个合成函数,每一个函数f[i] 与{1,2, ···, n} 都必须是双射关系,即不存在f[i][j] == f[i][k](j != k), 因此对于一个不确定的函数, 其可能的情况有n!个。如果用cnt 表示-1出现的次数, 那么如果cnt-1个未知函数确定了, 那么为了满足题目条件剩下的未知函数是确定的。所以答案即为cnt-1个不确定函数的排列情况。值为(n!)
2015-08-19 09:16:24
474
原创 hdu5400
根据题意,用数组ch[i]记录a[i]和a[i - 1]的差值, len[i]记录到a[i]为止形成的最长的序列长度。根据题意len[i] = len[i-1] + 1(即a[i] 可以添加的前面的序列)的情况有:1. ch[i] 等于 ch[i-1] 且ch[i] 等于d1或d2。 因为根据题意公差为d1或d2的等差序列都满足条件。 2. ch[i] 等于 d2 而且 ch
2015-08-18 21:15:47
624
原创 一些斐波那契恒等式及证明。
首先说明斐波那契数列的定义:用F[i] 表示斐波那契数列的第i项,F[1] = 1, F[2] = 1, 当n >= 3时,F[i] = F[i-2] + f[i-1]。斐波那契恒等式:1. F[1]^2 + F[2]^2 + F[3]^3 + …… +F[n]^2 = F[n]*f[n+1];证明:F[1]^2 = F[1] * F[2]; F[2]^2 = F[2] *
2015-08-15 10:38:51
3308
原创 hdu5384(AC自动机)
这道题是多模字符串匹配的题,使用的是AC自动机。直接套模板AC。#include #include #include #include #include #include #include using namespace std;struct Trie{ int next[100002][26],fail[100002],end[100002]; int r
2015-08-14 09:50:29
410
原创 组合数学的一些常见公式
1.特殊的排列组合:1.在n个不同物体中,可重复地选取r个物体的排列数为: n^r。;2.在n个不同物体中,可重复地选取r个物体的组合数为C(n+r-1, r);3.n个物体中不相同的物体的总数是k个,即n=n1+n2+ ··· +nk,则这几个物体全排列数是: n! / (n1! * n2! * ··· * nk!);4. 圆周排列(选取的物体不分先后):A(n, r) / r;
2015-08-12 15:37:59
4319
原创 UVA1625 Color Length(附 刘汝佳代码)
这是刘汝佳《算法竞赛入门经典第二版》的一道例题,只看书上的解释并没有理解,随后结合着代码才理解了。解题思路:用d[i][j]表示序列1移走i个元素和序列2移走j个元素的最小“代价”, 这个代价指的是由那些已经移出的字母合并而来的序列中已经出现但尚未结束的字母对总距离和的贡献。比如说一个合并而来的序列中有两个那样的字母,第一个在这个序列中后面有3个字母,另一个字母后面有2个字母,那么此时的代价就
2015-07-31 18:23:12
1051
原创 hdu5317 RGCDQ
首先计算出所有的f,这里容易超时,注意对优化。 易知f中的最大值为7,然后用一个数组d[i][j]记录f[1]到f[i]中有多少个j,这个用递推可得。 那么如果给定区间L, R, 则f[R][j] - f[L - 1][j]可算出1到7各出现了多少次, 根据这些次数就可以找出最大公约数了。代码如下:#include #include #include using namespace s
2015-07-28 19:00:45
687
原创 HUD5282 Senior's String 详解(使用DP解决组合数学)
题意:假设两个字符串的最长公共子序列长度为L,求第一个字符串中有多少个长度为L的子序列是第二个字符串的子序列。显然找出一个字符串的所有长度为L的子序列是组合数学问题,如果枚举所有子串的时间复杂度是n! 级的。这里就需要用动态规划来解决。首先用dp[i][j]和num[i][j]分别记录x的前I个字母和y的前j 个字母的最长公共子序列的长度和个数。先求出dp, 然后求num:。求num[i][j]分
2015-07-27 20:34:46
846
原创 UVA12563 Jin Ge Jin Qu hao(DP, 背包+技巧)
题意:求在给定时间内,最多能唱多少歌曲,在最多歌曲的情况下,使唱的时间最长。该题类似于01背包问题,可用01背包问题的解题思路来求,每个歌曲相当于物品,歌曲的长度相等于物品重量,每个歌曲的“价值”为1。由于金歌劲曲时间最长,所以最后要留至少1秒时间开始唱金歌劲曲,所以计算t-1时间内最多唱的歌曲和时间,最终答案为歌曲数加1,时间加上金歌劲曲的时间。这里我使用滚动数组计算这个值, 用len记录t
2015-07-27 17:18:56
1406
原创 UVA 11400(DP)
题意给定n种类型灯泡,每个灯泡给出其电压v,电源花费k,每个灯的花费c和需求量l,现在通过用电压大的灯泡替换某些电压小的灯泡来减小总花费,求最小的花费。首先要说明的是,为求得最小花费,对于某种灯泡,要么全部替换,要么全不替换,这个很容易证明。这个问题难就难在如何找子问题。如果先按灯泡电压把灯泡从小到大进行排序,定义dp[i]为替换第i种灯泡后前i种灯泡的最小花费,因为对一种替换情况,不知道
2015-07-26 18:37:11
2662
2
原创 UVA437(DP)
题意:求所给的n种石头最高能组成多高的塔,其中组成塔的石头的两条边必须分别大于它上面的石头的两条边。每种石头有无限个并且可以随意翻转。这道题容易迷惑人的一点是石头是无限的,但仔细考虑由于有大小的限制,所以同一个塔每种石头最多用2次,这样就相当于每种石头有两个了。显然,这是一道DAG上的动规,如果一个石头的两个边分别小于另一个石头的两条边,则说明这两个石头有边相连。由于石头可以随意翻转,所以一个
2015-07-26 15:30:22
652
1
原创 uva1471
这是LIS的变形,题意是求一个序列中去掉某个连续的序列后,能得到的最长连续递增序列的长度。 用DP的解法是:吧这个序列用数组a来记录,再分别用两个数组f记录以i结尾的最长连续递增序列的长度,g[i]记录以i开头的最长连续递增序列。然后像求DP求LIS一样遍历整个序列求出i前面所有小于a[i]的元素中以该元素结尾的最长序列f[j], 那么 dp[i] = g[j] + f[i], 这样时间复杂
2015-07-26 11:49:33
1744
原创 java,swing中setvisible()使用注意事项
java中的setvisible(true)目的是使控件可以显示出来,如果该控件已经被显示出来,那么该方法是控件显示在窗口的最前方。但其使用的位置需要注意。setVisible的对象一般是该对象的使用者调用的。如果setVisible在某个控件的内部,那么在setVisible函数后面添加的控件就显示不出来了。原因就在于,setVisible(true)并不是告诉JVM让该控件可见,而是在
2015-06-29 22:58:17
22581
原创 POJ3630(Trie树)
题目链接题意:求给定的多个串中是否存在,某个串是另一个串的前缀。解题思路:使用Trie树。在每次插入一个串的同时判断。对于该问题,只存在以下两种情况: 1.当前插入的串的前缀是前面的某个串。对于这种情况,把前面插入的串的最后一个节点记为危险节点。那么在后面插入串的时候,如果经过危险节点,说明这种情况成立。 2.当前插入的串是前面某个串的前缀。对于这种情况,把插入串的最后一个节点单
2015-06-21 21:03:20
1970
原创 Trie树的建立与简单应用
Trie树即字典树。是把多个串中的字母逐个插入到一开始只有根结点的树上二构成的树。Trie树的边表示的是模式串中的字母,从根结点走到任意节点经过的路径称为路径字符串。从根结点到叶子节点的路径字符串即为一个原来建树的模式串。Trie在解决涉及串的前缀时特别方便。这是具体的讲解和测试题我的代码:#include #include #include #include using n
2015-06-21 19:35:10
762
原创 C, C++中全局变量的默认值
在GCC编译器下各个类型的全局变量的默认值: 表示数字的变量类型默认值都为0 bool型默认值为false string型默认值为空字符串char 型比较特殊。char类型默认值为'\0', 即字符串结束标志,其整数值为0。如果用printf("%d")输出时值为 0, 但用printf("%c"),或cout 输出时显示为"a", char型数组默认值为空字符串,其中的每个元素与
2015-05-24 10:45:07
9636
2
原创 最大子矩阵和(poj1050 动规)
题意:给出一个数字矩阵,找出一个子矩阵,使得其中的数字之和最大。解题思路:这道题是对最大连续子串和的一种扩展。解决办法就是在二维矩阵转化为多个一维数组来求最大值。具体来说就是先固定所求子矩阵的左右边界i和j,然后求出每行从左边界到右边界的数之和,这样每行的和就可以作为一维数组的一个元素来求最大连续子串的和,这个和就是左右边界为i和j的最大矩形,枚举所有左右边界的情况,最后找出和的最大值即为最终
2015-05-12 20:10:51
771
原创 Poj2479(&poj2593)(动规)
题目链接:点击打开链接题意:在一个数组中找出两个不相交的串的的最大和。解题思路:这是最大连续和的一个变形,不同之处就在于是求两个不相交的串的最大和。容易想到的就是用两个数组来分别记录以i结尾的串最大和和以i开头的最大和,然后固定一个前一个或后一个串,遍历另一个串,找出其中最大的,然后改变前一个串,再找最大的,依次比较最终就得到最大值了,这样做的时间复杂度为O(n2)。但对于题目给的规模
2015-05-10 10:27:05
512
原创 poj4512(2013腾讯编程马拉松——完美队形1)(动规)
题目链接:点击打开链接解题思路:这道题与最长上升字序列有些类似,只不过是个对称的最长上升子序列。解题思路仍是动态规划。子问题:前j个数字和后i个数字组成的序列中的队形长度。状态转移: 如果a[i] == a[j] 那么队列的长度等于前j-1和后i-1个数字组成的队列中中间数字小于a[i]的队列的长度加上2,代码如下:#include #include #incl
2015-05-08 20:47:56
659
原创 hdu5223(GCD)
题目链接:点击打开链接题意:首先给定数组中有多少个数,只告诉你他们最小值为1,不告诉你每个数字是多少,要求根据给定区间中数的最大公约数,复原原来的序列。思路:先把所有的数初始化为1,然后根据指定问题,如果某一区间的最大公约数是ans, 那么这个区间中的所有数字都是ans的倍数,所以,把区间中的每个数字都赋值为原数字和ans的最小公倍数即可。这道题本来是一道水题,但由于自
2015-05-03 09:35:59
1575
原创 hdu2062
题意:求按字典序排列数串中的第m个数串这是一道简单的组合数学问题。下面列出一下情况,来介绍其中的规律。对于集合只有一个元素的情况1集合有两个元素11 222 1集合有三个元素:11 21 2 31 313 22 2 1 2 1 32 32 3 133 13 1 23 23 2 1可以发现对于含有
2015-04-20 22:24:46
583
原创 POJ2533, 最长上升子序列(贪心+二分查找时间复杂度O(nlogn))
解题思路参考这位大神的博客:点击打开链接。在这里,我介绍下我对该方法的理解。使用这种方法是对动态规划方法的一种优化,在用动态规划求解时,求到第i个元素的最长上升子序列时,是在前i-1个数中寻找,比第i个元素小的且最长上升子序列最大的元素的最长上升子序列,在其基础上加一即为到该元素的最长上升子序列。在这次查找中浪费了时间,
2015-04-17 11:27:35
1093
原创 poj1386(欧拉回路)
题目链接解题思路:把每个单词当成是一条有向边。把首字母和尾字母当成是节点,如果该字母是一个单词的首字母,该字母的入度就加一,如果是尾字母,该字母的出度就加一。然后判断是否形成欧拉回路即可。欧拉路径判断条件:首先该图必须是连通图。对于无向图,所有顶点的读都为偶数,对于有向图,要么所有顶点的入度等于出度,要么只有两个顶点入度和出度不同,一个入度比出度大一,一个出度比入度大一。连通图的判断方
2015-04-13 22:21:28
521
原创 poj1611(并查集)
先说并查集的概念: 并查集处理的是求在树中,求某些元素是否在同一个集合。这种操作不关注同一个集合中某些点的邻接关系,只关心他们是否在同一个集合中。其中的操作有三种分别是合并两个集合,查询一个元素在哪个集合,查询两个元素是否在同一个集合。处理方法用一个数组par[]记录每个节点的根结点,一开始将每个节点的根结点初始化为自身,随后由给出的邻接点修改该数组的值,之后不断地把任意节点直
2015-04-13 22:17:25
612
原创 POJ1195(二维线段树)
二维线段树二维线段树的基本结构就是在一维的基础上增加一棵线段树,实现树套树的结构这里以Y坐标为主,在Y坐标基础上构建X坐标上的树。仍然用数组去模拟树,只不过这里用二维数组修改某个结点是先从Y方向上查找对应位置,找到Y坐标后在找X坐标,在找Y坐标是先不用管X坐标的值,找到Y坐标后在在改行中找X坐标,类似于求积分中的先Y后X法。查找是也一样。在传递参数是一定要认真,参数传递错误很难发现和修改。
2015-04-08 22:08:46
793
原创 poj3321 (树状数组)
题意:给出一棵树,一开始每个节点都长着一个苹果,有两种操作,一种是改变某个节点苹果状态(之前有苹果改为无苹果,无苹果改为由苹果),另一种就是求一个节点连同其所有子节点的苹果总数。 难点: 如果利用树状数组或线段树,如何构造区间?解题思路:利用深度优先搜索把每个节点开始遍历和结束遍历的时间记录下来,因为在开始时间和结束时间之间遍历了这个节点的所有子孙节点,所以可以
2015-04-08 22:00:58
577
原创 关于scanf函数
关于scanf函数scanf函数是编程中最长使用的函数之一了,掌握scnaf函数的使用是学好编程的基础。首先是scanf函数的返回值问题:如果scanf函数返回的是执行一次读取,匹配成功的个数。如:scanf(“%d%d%d”,&a, &b, &c)如果输入1, 2, 3,返回值为3,如果输入1 2 b 4读取到b后就结束了,返回值为2; 如果输入a, b, c,返回值为0。
2015-03-29 13:28:26
888
原创 Vijos1114解题报告(不建树解决二叉树问题)
我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。FBI树是一种二叉树1,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:1) T的根结点为R,其类型与串S的类型相同;2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。现在给定一个长度为2^N的“01”串,请用上述构
2015-03-29 11:49:12
629
程序员面试宝典
2014-06-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人