04 2013 档案

摘要:题目链接:http://poj.org/problem?id=2286 IDA*对于最优解层数小,每次扩展状态多的时候是一个杀手锏啊。IDA*就是一个加了层数限制depth的DFS,超过了限制就不在搜索下去,如果在当前层数没有搜到目标状态,就加大层数限制depth,这里还只是一个IDA算法,并不是A*的。当然我们可以用A*的估计函数去剪枝,如果当前深度d+h()>depth的时候就可以不再搜索下去了,这样就是IDA*了。 对于这道题,我们把状态用一维数组存储,然后对每个元素设定相应的编号: 0 1 2 3 4 5 ... 阅读全文
posted @ 2013-04-30 22:10 zhsl 阅读(495) 评论(0) 推荐(0)
摘要:八数码问题,对于一般的数据,BFS+逆序对HASH就可以解决了,或者双广搜索。进一步的话就是A*优化,A*的启发函数有以下两种:1,不在相应位置的格子数目; 2,不在相应位置的曼哈顿距离之和;显然第二种的效率比较高。一中兼顾效率,写起来有方便的算法就是IDA*,因为不要判重,而且是DFS,代码量小。还有猥琐点的方式就是从目标状态向所有状态扩展打表。。。 对于八数码问题,还有一个重要剪枝,那就是逆数对的剪枝,如果开始状态的逆数对数目是奇数则必无解,否则一定有解。因为对于目标状态的逆序对是0,即偶数,而操作只能与0交换,而0是不会影响结果的,只有于0交换的数会影响结果,但是那个数移动也会没有... 阅读全文
posted @ 2013-04-30 21:44 zhsl 阅读(500) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3294 多个串中,出现次数为k次的最长公共子串的个数,并且输出。 一般的算法就是后缀数组加二分,复杂度O(n*logn)。其实也可以和POJ3415一样维护一个栈,思想都是差不多的,维护一个单调递增的栈,每到一个height[i]时,先保证栈单调递增并且统计个数sum,然后height[i]再与当前最优值比较,如果大于最优值,那么看sum是否大于k,如果大于则更新最优值。平均复杂度O(n)。 二分代码: 1 //STATUS:C++_AC_375MS_4328KB 2 #include<stdio.h> 3 #in.. 阅读全文
posted @ 2013-04-25 23:58 zhsl 阅读(253) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3415 求两个串的长度不小于K的公共字串的个数。 利用height[]来维护一个单调递增的栈,即栈保存的是满足要求的heigiht数组的最小值,附加维护栈中相邻两个元素之间的个数。 1 //STATUS:C++_AC_813MS_6532KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include< 阅读全文
posted @ 2013-04-25 23:44 zhsl 阅读(339) 评论(0) 推荐(0)
摘要:程序员之路--关于代码风格 优秀的代码风格如同一身得体的打扮,能够给人以良好的印象。初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格。本文就代码风格中的几个重点问题进行了讨论,并在文后给出了一份优秀的代码作为风格模板。代码风格不必花费太多专门的时间研究,在使用中不断模仿模板代码,轻轻松松就能写出“专业的代码”。一、80字符,代码行极限 无论时空怎么转变,世界怎样改变,一行80字符应始终铭记心间。古老的Unix终端以80列的格式显示文本,为了让源代码与手册具有最佳的可读性,Unix系统始终坚持着80列的传统。80列不多不少,足够写出一行有意义的代码,同时也足够显示在终端屏幕,足.. 阅读全文
posted @ 2013-04-25 18:21 zhsl 阅读(231) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2774 两个字符串的最长公共字串。 求出height数组后直接二分答案就可以了,或者线性扫描一遍。 1 //STATUS:C++_AC_594MS_4800KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 阅读全文
posted @ 2013-04-24 19:39 zhsl 阅读(217) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3693 求字符串的重复次数最多的且字典序最小的字串。 很不错的题目。罗穗骞大牛论文的模板题,摘了Neo / Add ~0U>>1大牛的详细题解,如下: 首先求第一问最大重复数。从N的范围来看O(N^2)虽不靠谱,但是起码能带来些有用的启示。方法有二,一是枚举开头位置求重复长度;二是枚举重复长度求开头位置。第一种方法求最大重复数的方法MS也只有枚举重复长度然后去判……所以说我们从第二个方法入手。O(N^2)的方法是再枚举开头位置。我们来考虑一下能不能少枚举一些开头位置——更确切地说,能不能只枚举一些特殊位置,设当前枚举的 阅读全文
posted @ 2013-04-24 17:22 zhsl 阅读(320) 评论(0) 推荐(0)
摘要:做了几道划分树的题目,划分树的效率很高,用来求区间第K小值和区间小于K小值的和,每次动态询问的复杂度为O(logn)。其中POJ2104,POJ2761,HDU2665为典型的求区间第K小值,HDU3743还加上了求和的操作,推荐去做一做。 下面是HUD3743的代码: 1 //STATUS:C++_AC_343MS_30048KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 阅读全文
posted @ 2013-04-22 14:02 zhsl 阅读(440) 评论(0) 推荐(0)
摘要:盗了别人的资料。。。其实看下面的一个图片就知道划分树的结构了,和归并排序极为相似: 注意:一定要注意其中中位数有多个相同的情况,需要统计。例如,上图第一次操作,只有一个3到了左区间。下面是具体的讲解:TonyShaw 如果对于一段区间,仅查找一次第k大元素的话好说,直接一个快排搞定。 如果有多次离线询问,然后就可以通过归并排序,建一棵归并树(nlogn)对于树的每一个节点,通过归并排序递归的建立一个序列,其中每个节点[l,r]表示原序列中,[l,r]这些数字排序以后的状态。如图,红色节点表示会被分到左子树。 就这样,在区间[l,r]查找第k大元素的时候,先二分枚举元素x,求出x... 阅读全文
posted @ 2013-04-22 13:52 zhsl 阅读(237) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3261 求可重叠的至少出现K次的最长公共前缀。 先用后缀数组求出height数组,然后二分答案。 1 //STATUS:C++_AC_47MS_720KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #in 阅读全文
posted @ 2013-04-19 20:59 zhsl 阅读(175) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1743 题意:给一些数字串,当做韵律,相同的韵律必须满足: 1,最少5个数字长; 2,重复出现的时候,必须相对差值一样,比如{ 1 ,2, 3, 22, 10, 11, 12 },1,2,3与10 11 12是一样的韵律。 3,韵律不可重叠。 先用后缀数组处理,然后对height数组二分答案就好了。 1 //STATUS:C++_AC_266MS_724KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #incl 阅读全文
posted @ 2013-04-19 01:46 zhsl 阅读(224) 评论(0) 推荐(0)
摘要:关于后缀数组的资料,可以看NOI2009国家集训队论文罗穗骞 的<后缀数组——处理字符串的有力工具>。/* suffix array 倍增算法 O(n*lgn) build_sa( ,n+1, ) 注意n+1 getHeight( , n) n = 8 ; num[] = { 1, 1, 2, 1, 1, 1, 1, 2, $ }. 注意num数组最后一位值为0,其它位须大于0! rank[] = { 4, 6, 8, 1, 2, 3, 5, 7, 0 }. (rank[0~n-1]为有效值) sa[] = { 8, ... 阅读全文
posted @ 2013-04-19 01:40 zhsl 阅读(290) 评论(2) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3461 典型的KMP模板题,直接匹配个数即可。 1 //STATUS:C++_AC_94MS_1240KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #i 阅读全文
posted @ 2013-04-16 22:01 zhsl 阅读(182) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3630 建立一个Trie树查找就可以了,但是这里动态建立Trie居然会超时,静态化居然可以秒,太不厚道了= = 当然还可以用qsort秒过,依次比较。。。 1 //STATUS:C++_AC_110MS_2568KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 阅读全文
posted @ 2013-04-16 21:01 zhsl 阅读(253) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3128 题意:给定一个置换,求是否能由另一个置换平方后组成。 简单的性质,只要所给的置换中相等的偶数长度循环个数为偶数个就是可行解。 1 //STATUS:C++_AC_0MS_196KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<al 阅读全文
posted @ 2013-04-13 20:37 zhsl 阅读(246) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1721 置换群的分数幂运算,分数幂运算考虑的是置换的合并,但这道题简化了很多,首先注意到“Alice first writes down all the numbers from 1 to N in some random order: a1, a2, ..., aN. Then she arranges the cards so that the position ai holds the card numbered ai+1, for every 1 <= i <= N-1, while the position 阅读全文
posted @ 2013-04-13 19:28 zhsl 阅读(439) 评论(0) 推荐(1)
摘要:题目链接:http://poj.org/problem?id=1282 终于把这道题目给A了。 先来看看特殊情况:如果p=1的话,那就很容易做了,直接求每个循环节的长度,然后再求最小公倍数就行了。但是p!=1呢?如果依葫芦画瓢,通过n个置换去找循环节,然后再去求最小公倍数,那么难点就在找循环节上,很难处理,因此考虑换一种方法。 NOI2005论文,潘震皓的<置换群快速幂运算研究与探讨>上有详细介绍,主要是对置换进行一个变化,然后去枚举答案。 1 //STATUS:C++_AC_0MS_452KB 2 #include<stdio.h> 3 #include<std 阅读全文
posted @ 2013-04-13 13:25 zhsl 阅读(525) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2407 欧拉函数模板题目: phi(n)=n*(1-1/p1)*(1-1/p1)*...*(1-1/pn)。 1 //STATUS:C++_AC_0MS_152KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 阅读全文
posted @ 2013-04-13 13:07 zhsl 阅读(220) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=2891 题意:求解模线性方程组,且任意的ai可能不互质。 直接用扩展欧几里得求解就可了,具体可以看:http://www.cnblogs.com/zhsl/archive/2013/04/12/3017109.htm 1 //STATUS:C++_AC_0MS_196KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 阅读全文
posted @ 2013-04-12 17:59 zhsl 阅读(277) 评论(0) 推荐(0)
摘要:模线性方程组:x=a1(Mod m1) x=a2(Mod m2) ...... x=an(Mod mn) 这个问题的源自《孙子算经》,其中有这样一道算术题:“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?”按照今天的话来说:一个数除以3余2,除以5余3,除以7余2,求这个数.这样的问题,也有人称为“韩信点兵”.它形成了一类问题,也就是初等数论中解同余式.这类问题的有解条件和解的方法被称为“中国剩余定理”,这是由中国人首先提出的.首先来看一个简单的例子:① 有一个数,除以3余2,除以4... 阅读全文
posted @ 2013-04-12 17:57 zhsl 阅读(840) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3974 Manacher算法效率真不错,用后缀数组A的都沙茶了。。 1 //STATUS:C++_AC_235MS_10904KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vec 阅读全文
posted @ 2013-04-10 14:42 zhsl 阅读(279) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513 当时比赛没有A掉的题目,在Manacher匹配的时候维护有序就可以了。 1 //STATUS:C++_AC_156MS_2212KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm& 阅读全文
posted @ 2013-04-10 14:39 zhsl 阅读(563) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 直接用Manacher算法解决即可,先构造字符串,例如 abc -> $#a#b#c# ,第一个‘$’是为了防止溢出字符串。其实也可以不构造字符串,直接去Manacher,具体做法是,当 i 为奇数时为‘#’,为偶数时再去比较。 1 //STATUS:C++_AC_281MS_1348KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math. 阅读全文
posted @ 2013-04-10 14:37 zhsl 阅读(378) 评论(0) 推荐(0)
摘要:转送门:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824 这里,我介绍一下O(n)回文串处理的一种方法。Manacher算法.原文地址:http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear-time-algorithm-for-finding-longest-palindrome-sub-string/ 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个... 阅读全文
posted @ 2013-04-10 14:31 zhsl 阅读(219) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1699 太爽了这题,1AC。容易想到用状态压缩DP来做,f[k][i][j]表示当前 i 状态有 k 个串并且串以 j 结尾的最短串。则 f[k][i][rt]=Min{ f[k][i][rt] , f[k][st][r]+len[j]+g[r][j] }。其中状态 i 用位运算表示所包含的具体的串,1010表示包含串2和4。这里要注意转移方程中的rt,要考虑串包含的情况。 1 //STATUS:C++_AC_0MS_324KB 2 #include<stdio.h> 3 #include<stdlib.h> 阅读全文
posted @ 2013-04-10 00:34 zhsl 阅读(542) 评论(1) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 状态转移方程还是很好想的:f[i][j]表示第 i 个节点放 j 个机器人的最优解,f[i][j]=Min{ f[i][j] , f[i][j-k] + f[v][k] + (k?k:2)*e[i].w } 。 写这个树形DP的时候,暴露了我以前没有仔细考虑的问题,导致状态转移的时候删删改改了很久。、 1.仔细考虑转移方程初始化的问题,要根据求Min或者Max以及容量是否恰好来确定。 2.在分组背包转移时,f[i][j]是前几组的最优值。 1 //STATUS:C++_AC_25... 阅读全文
posted @ 2013-04-09 21:18 zhsl 阅读(405) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3070 矩阵乘法优化,水题一枚。 1 //STATUS:C++_AC_132MS_0KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #include< 阅读全文
posted @ 2013-04-09 21:09 zhsl 阅读(299) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1674 看到题目就想到:ans=n-循环节个数。 1 //STATUS:C++_AC_32MS_212KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 #i 阅读全文
posted @ 2013-04-09 00:46 zhsl 阅读(467) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1707 利用bernoulli方程来解决此题。 数学上,伯努利数Bn的第一次发现是与下述数列和的公式有关: 其中n为固定的任意正整数。 这数列和的公式必定是变量为m,次数为n+1的多项式,称为伯努利多项式。伯努利多项式的系数与伯努利数有密切关系如下: 举例说,把n取为1,我们有 伯努利数可以由下列递推公式计算: ,初值条件为B0= 1。 [摘自wikipedia] 注意:这里计算的是0~m-1的值,因此最后第二项还要加上一个m^n; 1 //STATUS:C++_AC_0MS_140KB 2 #i... 阅读全文
posted @ 2013-04-08 23:25 zhsl 阅读(618) 评论(0) 推荐(0)
摘要:摘自:http://www.cnblogs.com/jackiesteed/articles/2198534.html想深究的童鞋可以看看这本书:)-->100个著名初等数学问题历史和解.pdf第01题,阿基米德分牛问题.太阳神有一牛群,由白,黑,花,棕四种颜色的公,母牛组成.在公牛中,白牛数多于棕牛数,多出之数相当于黑牛数的1/2+1/3;黑牛数多于棕牛数,多出之数相当于花牛数的1/4+1/5;花牛数多于棕牛数,多出之数相当于白牛数的1/6+1/7.在母牛中,白牛数是全体黑牛数的1/3+1/4;黑牛数是全体花牛数1/4+1/5;花牛数是全体棕牛数的1/5+1/6;棕牛数是全体白牛数的1 阅读全文
posted @ 2013-04-08 19:21 zhsl 阅读(621) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1286 有旋转和轴对称两种基本置换,先考虑旋转的情况,当旋转 i 个珠子的时候,可以得出循环节有gcd(n,i)个,则和为 Σ 3^gcd(n,i)。轴对称的情况很容易考虑,分n为奇数和偶数就可以了,n为奇数: n*3^((n+1)/2) n为偶数:n/2*(3^(n/2)+3^(n/2+1))。 1 //STATUS:C++_AC_0MS_132KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include 阅读全文
posted @ 2013-04-08 17:17 zhsl 阅读(354) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3270 把数列循环分解,注意到长度为k的循环最少用k-1次置换,那么次循环的最优值就是用循环中的最小值去与每个置换,还要考虑此循环中的最优值可以由其它循环影响,影响的那个循环肯定还有数列中的最小值。 1 //STATUS:C++_AC_16MS_396KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #incl 阅读全文
posted @ 2013-04-08 00:50 zhsl 阅读(299) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1026 简单的置换题目,求出置换群后直接取余即可。 1 //STATUS:C++_AC_32MS_308KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include<algorithm> 9 #include<vector>10 # 阅读全文
posted @ 2013-04-07 21:55 zhsl 阅读(226) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1964 空白区域之间有权值,求经过所有空白区域的哈密顿回路的最小权值。简单的插头DP,空白区域特殊处理即可。 1 //STATUS:C++_AC_203MS_664KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 8 #include 阅读全文
posted @ 2013-04-07 13:02 zhsl 阅读(304) 评论(0) 推荐(0)
摘要:题目链接:http://acm.fzu.edu.cn/problem.php?pid=1977 题目(备份):View Code Problem DescriptionThe pollution of the earth is so serious that people can not survive any more. Fortunately, people have found a new planet that maybe has life, and we call it "Pandora Planet".Leonardo Da Vinci is the only 阅读全文
posted @ 2013-04-03 17:51 zhsl 阅读(444) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=3133 用两条线段分别连接2-2和3-3,使得他们长度的总和最小。 典型的插头DP题目,用0,2,3,种状态来表示每个格子的插头分别是没有插头,2号插头,3号插头,然后把所有可能的转移情况列出来,只是情况比较多,而且一定要考虑仔细,不然检查代码会很惨的。。话说A完这道题后感觉真爽啊O(∩_∩)O~ 1 //STATUS:C++_AC_360MS_900KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #inclu 阅读全文
posted @ 2013-04-03 13:12 zhsl 阅读(364) 评论(0) 推荐(0)
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3399 要注意此题的班级必须是连续的!!! 转移方程容易想出来:f[i][j]表示前 i 个班级分 j 个学生的最优解,那么 f[i][j]=Min{ f[i-1][k] + Σ(x[k]-L)^2*g[i] | j-B<=k<=j-A },然后预处理Σ(x[k]-L)^2 -> s[k]。则 f[i][j]=Min{( f[i-1][k] - s[k]*g[i] ) + s[j]*k| j-B<=k<=j-A },注意到 f[i] 阅读全文
posted @ 2013-04-02 01:14 zhsl 阅读(376) 评论(0) 推荐(0)
摘要:题目链接:http://poj.org/problem?id=1739 完全可以用Ural 1519 Formula 1 插头DP(单回路)的代码解决此题,只要把图修改一下: .... ........ .... -> .######. .... .#....#. .#....#. .#....#. ........ 当然也可以在起点和终点独立处理插头。修改建图:View Code 1 //S... 阅读全文
posted @ 2013-04-01 01:18 zhsl 阅读(375) 评论(0) 推荐(0)
摘要:题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1519 一条哈密顿回路路,反正是写到蛋疼了,不过终于解决了,插头DP这玩意,太容易出错了,要注意block的处理。 1 //STATUS:C++_AC_343MS_961KB 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 #include<math.h> 6 #include<iostream> 7 #include<string> 阅读全文
posted @ 2013-04-01 01:10 zhsl 阅读(619) 评论(0) 推荐(0)