POJ
文章平均质量分 76
cscoder
这个作者很懒,什么都没留下…
展开
-
POJ 1743
Musical Theme用了一个星期的时间学了一下后缀数组,然后将罗穗骞论文上的题目都做完。有些题写起来太蛋碎了。。。这道题是论文上的第一道题目,还是蛮简单的。。直接二分长度l,利用height数组将后缀分组,然后判断同组的是不是存在排名第i和j的后缀使得abs(sa[i] - sa[j]) >= l。#include #define maxn 20005int r[m原创 2013-01-22 22:56:08 · 522 阅读 · 0 评论 -
POJ 2492 A Bug's Life and POJ 1703 Find them, Catch them
A Bug's Life并查集的应用。与食物链那到题目类似,对于关系明确的bug之间合并,用数组p[x]和d[x]分别表示x的父节点以及x与父节点之间的关系,我们可以假设d[x]=0表示x与p[x]是同性,d[x]= 1表示x与p[x]是异性。对于查操作的时候,我们不断的压缩路径,同时更新d[x]的值,这里d[x] = (d[x] + d[p[x]])%2,很容易推出来,具体看程序中f原创 2012-08-18 09:07:47 · 769 阅读 · 0 评论 -
POJ 3691 and Hduoj 2457 DNA repair
POJ 3691 DNA repairHduoj 2457 DNA repair AC自动机+DP。先建立AC自动机,再来看DP。和前面类似考虑方程的时候我们可以结合字符串的长度与AC自动机的状态,来写方程。设dp[i][j]是单词长度为i走到j时最少需要修改单词的个数。那么考虑状态的转化,由于要不含致病基因,那么也就是状态不能走到叶节点。考虑状态j是由那些转化而来的原创 2012-08-17 16:53:07 · 537 阅读 · 0 评论 -
POJ 3764 The xor-longest Path
The xor-longest Path字典树的题目,开始看的时候毫无头绪,不知道怎么下手,看了别人的解题博客后终于明白了怎么做。这道题目出的很巧妙。之前比赛的时候遇到过一道类似的题目,不过当时我们没做出来,我们队伍还比较弱,还要奋斗啊。大致思路:由于以下式子的成立:(a^b)^(b^c) = c ,所以我们可以这样来建树,每个节点保存从根节点走到当前节点的异或值。然后我们建立一个01字典树。原创 2012-08-02 10:35:30 · 389 阅读 · 0 评论 -
POJ 1625 Censored!
Censored! 这个题目写了一天多的时间,开始的时候,虽然对主要的思路清楚了,但是有些细节问题没有想清楚。在解DP的时候,开始写的时候没有对状态转化搞的很清楚,所以中间出现错误然后又调试了很久,这就浪费了很长的时间。以后还是想清楚细节之后再去敲代码,得训练一下写代码的思维,如何思考更有利于写代码,而不仅仅是注重于问题的解法是什么。 说下这个题目我个人的想法:先建立tri原创 2012-08-16 14:57:40 · 747 阅读 · 0 评论 -
POJ1953 World Cup Noise
World Cup Noise这个题目有点类似于自动机DP,就是给定由n位组成的01序列,求不包含连续的1的序列个数。由于长度为n的字符串是有长度为n-1的字符串组成的,所以我们可以这么考虑,长度为n的字符串可以怎样从n-1的转化过来,对于以0或者1结尾的长度为n-1字符串,可以添加一个0得到以0结尾的长度为n的字符串,而不会使得序列的合法性得到破坏,如果我们要获得一个以1结尾的字符串,我们只原创 2012-08-14 10:26:43 · 438 阅读 · 0 评论 -
POJ 1014 Dividing
Dividing题目意思很清楚,这里就不再翻译了。初始的时候,我将他当作分组背包(估计是最近做分组背包做的太多了),来解,但一直超时,后来分析了一下时间复杂度为O(v*n),看了一下数据后,发现根本不可能过的去,v最大可有90000,而n最大有20000,这样怎么可能过的去。。。。。。后来看别人的解题报告的时候,发现可以用多重背包。然后我就对比了一下两者的情况。用分组背包的时候是这么考虑的:每原创 2012-08-14 09:20:37 · 451 阅读 · 0 评论 -
POJ 2676 Sudoku
Sudoku回溯题目,求解一个可行解,类似于8皇后问题。规则很简单,也是类似于8皇后的规则。玩过数独就很容易理解题意了。给定一个没有填写完整的数独,找出一个可行解即可。标记每行每列以及3*3小矩阵的哪些数字已经被放过,每次放置前先检查是否合法(不出现重复数字),然后放置。#include#include#includeusing namespace std ;#defi原创 2012-07-11 12:43:00 · 352 阅读 · 0 评论 -
hdoj 3298 Contestants
Contestants树形DP题目,这个题目与hduoj4081以及金华邀请赛的power station (POJ 4045)比较相似。不过这个题目相对于后面两个要简单的多。我们可以先进行一遍DFS处理出以1为根节点的树的所有节点的子节点数目,然后就是求最小差值。枚举每条边,这里可以直接枚举点来进行。注意数据范围就可以了。#include #include #include #in原创 2012-08-07 18:43:15 · 701 阅读 · 0 评论 -
POJ 1325 Machine Schedule
Machine Schedule二分图匹配题目。首先是建图方式:如果两台机器分别在模式xk1 , yk2下能完成相同的工作,那么这两个模式连一条边。这样的话,每完成一个工作就相当于将图中的一条边给完成。这样问题就转化为寻找最少的点来看住所有的边,也就是最小点覆盖问题。最小点覆盖问题: 最小点的覆盖也是图的顶点集的一个子集,如果我们选中一个点,则称这个点将以他为端点的所有边都原创 2012-08-08 16:20:05 · 404 阅读 · 0 评论 -
POJ 1182 食物链
食物链这道并查集的题目,一直没去做,虽然学并查集已经快一年了,但是这个题目一直没搞懂。时间拖的太久了,这个习惯不好,以后得对于不会的题目要及时解决,不能一直拖着不做。今天又看了一下这个题目,参看这别人的解题报告,终于搞懂了。我们对这个并查集维护两个数组p[] 和d[],分别表示x 的父节点和x与其父节点的关系。定义0表示x,y同类,1表示x被y吃,2表示x吃y。然后我们来看并查集的有关操作原创 2012-06-15 23:07:04 · 305 阅读 · 0 评论 -
POJ 1635 Subway tree systems
Subway tree systems这个题目是判断给定的两个序列是不是对同一棵树的遍历结果,也就是树的同构问题。首先可以求出一每个节点为根的子树的孩子节点的数目(包括该节点),然后对节点数目进行排序,那么这个排序的序列即可作为该树的一个最小表示,然后我们只需要判断两棵树的最小表示是不是相同即可。对于题目中给定的01序列是对于树的遍历结果,对于每一棵子树必定有相同个数的0和1,我们可以依据来求原创 2012-08-07 13:51:49 · 675 阅读 · 0 评论 -
POJ 1067 取石子游戏
取石子游戏威佐夫博弈,对于给定的两堆石子个数(a , b)a 威佐夫博弈及其它博弈介绍 #include #include using namespace std ;int main(){ int a ; int b ; while(cin>>a>>b){ if(a > b){ a ^= b ;原创 2012-08-07 21:50:21 · 455 阅读 · 0 评论 -
POJ 1190 生日蛋糕
生日蛋糕一道很经典也很基础的搜索题目。有题目的条件我们可以得到两个方程:sum(Rk*Rk*hk) = N 和 S = sum(2*Rk*hk)+R1*R1首先考虑极端剪枝法。假设前i层体积为T,如果剩下的若干层,每层都去最小可能值,体积仍比N大,则剪去,如果剩下几层都去最大值,体积仍比N小,也减去。如果当前的表面积比S大,则剪去。然后考虑一个隐藏的条件,我们可以由式子sum(Rk *原创 2012-08-06 13:11:32 · 490 阅读 · 0 评论 -
POJ:1659Frogs' Neighborhood
http://poj.org/problem?id=1659此题是判断输入的数字序列数不是可图的,在这里我们采用Havel-Hakimi定理。Havel-Hakimi定理如下:Havel-Hakimi 定理:由非负整数组成的非递增序列s:d1,d2 ,.....,dn (n>=2 , d1>=1)是可图的,当且仅当序列s1:d2 -1 d3 - 1 ,......,dd原创 2012-03-24 17:04:56 · 307 阅读 · 0 评论 -
POJ2263:Heavy Cargo
http://poj.org/problem?id=2263题目是求一条能承载最重货物量的路径,只需求出最大的承载量。这题可以利用Floyd思想来解决,从i到j的路径中假设经过k,则该条路最少的承载量为min{ map[i][k] , map[k][j]},故对应的i到j的最大承载量为max{ map[i][j] , min{map[i][k] , map[k][i]}}。这样问题就可以解决了原创 2012-04-10 13:45:40 · 356 阅读 · 0 评论 -
POJ 1364 King
King简单的差分约束问题,给定若干个序列号从x到y的和的结果与某个数的比较。设num[x]表示前x个数字之和,序列下标从1开始,我们设置一个超级源点0。然后对应的某个区间的数字之和即可以表示为某两个数字之差。这样我们就可以转化为差分约束方程求解.还需要注意的一点就是要对右端的数字进行一下适当的变换,变>,= ,#include#include#define MAXN 104原创 2012-06-18 23:17:26 · 310 阅读 · 0 评论 -
POJ 1988 Cube Stacking
Cube Stacking 并查集的题目。题目大意:由N个箱子,有如下两种操作:M x y操作,每次将含有编号为x的箱子所在的一堆箱子移动到含有编号为y的箱子所在的一堆箱子上。C x 操作,询问x下面有多少个箱子。很容易想到用并查集,但是对于并与查操作怎么处理?一种很简单的方法就是我们可以取每堆箱子中的堆底箱子做为根节点,每当合并时,就将放在上面的那堆箱子所有的高度全部更新一下,但原创 2012-08-18 21:22:52 · 441 阅读 · 0 评论 -
POJ 2778 DNA Sequence
DNA Sequence 自动机的又一题。这个题目和前面的那个题目POJ1625很相似,不过POJ1625的数据范围没有这么大,如果按照那个题目那样递推过来的话,肯定会超时。对于这么大的数据,一般会想到加速计算,多采用二分法,例如:快速幂取模,矩阵快速幂。而这个题目就是用矩阵快速幂来加速计算的。和前面一样我们可以很容易的写出状态转移方程,其实是一样的方程,这里就不再写了。我们把这个原创 2012-08-16 19:48:56 · 445 阅读 · 0 评论 -
POJ 2356 Find a multiple 鸽巢原理
Find a multiple记sum[i] = (sum[i-1] + num[i])%N,显然对于sum[1...N]肯定会分布在0....N-1中,如果出现sum[i] = 0,显然我们已经找到了一组解;如果没有出现,也就是说sum[1...N]的值都分布在1....N-1中,N个数分布在1....N-1中,显然会出现sum[i] = sum[j], 其中i != j;这原创 2012-11-21 12:28:45 · 544 阅读 · 0 评论 -
POJ 3756 Chess Game
Chess Game高斯消元求期望设dp[i]为处在格子i走到格子N时的期望,很容易得出方程,但是存在后退操作,所以方程中会存在dp[j]其中j/* author : csuchenan prog : POJ 3756 algorithm: 高斯消元+期望 csuchenan 3756 Accepted 252K 16MS原创 2012-10-25 00:42:05 · 557 阅读 · 0 评论 -
POJ 3156 Interconnect
Interconnect昨天一天都在这个题上面个wa,晚上回来又重新打了一遍,然后就进400多毫秒过了这个题目。。。很是惊讶。然后仔细一看,原来是之前有地方写错了,这让我情何以堪。。。。发现自己打代码的能力越来越差,不能很快的将自己的思路用代码给表现出来。。。还要一直狂DEBUG(现在愈来愈认为DEBUG是一个非常不好的东西。。。)。。。计算期望的时候:E(i) = pk* E(i原创 2012-10-24 09:06:44 · 702 阅读 · 0 评论 -
POJ 1770 Special Experiment
Special Experiment题目描述同POJ1192一样繁琐。。。意思很简单,如果两个原子的能量之差刚好是某个光子的能量,那么将会引起爆炸。。现在选取若干个原子,使得他们的能量之和最大,且不发生爆炸。建树方式:如果两个原子能量之差刚好是一个光子的能量,那么连边这样问题就变成了求最大独立集。方程就不在写了。。。具体看程序#include #include #include原创 2012-10-19 13:01:37 · 892 阅读 · 0 评论 -
POJ 1192最优连通子集
最优连通子集题目的描述太繁琐了。。。其实意思简单,就是给定若干个点,如果两个点之间的曼哈顿距离小于1,就连边。然后就构成一颗树,然后每个点都有一个权值,然后选取若干个点,使得权值和最大,并且点与点之前都连通。简单的树形DP,dp[i]表示以i点为根的子树并且选取i点时的最大权值。方程就很好写,dp[i]+=dp[u] ,其中u为i的儿子节点,并且dp[u]>0直接dfs一次,同时直原创 2012-10-19 12:47:16 · 582 阅读 · 0 评论 -
POJ 2378 Tree Cutting
Tree Cutting给一棵n个节点的无根树,问去掉哪个节点后可以使所有连通分支的节点数均,遇到小于等于n/2的,直接输出。。。#include #include #define maxn 10001int dp[maxn] ;int first[maxn] ;int next[maxn<<1] ;int edge[maxn<<1] ;int n ;inline原创 2012-10-19 12:36:56 · 369 阅读 · 0 评论 -
POJ 3107 Godfather
Godfather树形DP简单题,就是找到这样的点:删除该点后最大的连通子树所包含的节点个数最小。然后将这些点依次输出。dp[i] = max{dp[j] , n-number} , j是i的儿子节点,number是i所在子树的总结点个数。#include #include #include #define maxn 50005using std::vector ;int n原创 2012-10-19 12:20:15 · 429 阅读 · 0 评论 -
POJ 3071 Football
Football计算概率的题目。模拟对应的过程,然后按照概率公式计算主要是在计算每一轮的每个人的可能的对手的时候比较麻烦。我们先计算出,每个人所属的组,然后计算出每个人与其相邻的组,也就是本轮所需要的PK的对手的组,然后对需要PK组一一计算概率。/* author : csuchenan prog : POJ 3071 Algorithm: Prob原创 2012-10-05 23:27:05 · 405 阅读 · 0 评论 -
POJ 2096 Collecting Bugs
Collecting Bugs首个概率DP类题目。题意: 一个软件有S个子系统,会产生n中bug某人一天发现一个bug,这个bug属于一个子系统并且属于一个分类。每个bug属于某个子系统的概率是1/s,属于某个分类的概率为1/n,求发现n中bug,每个子系统都发现bug的天数的期望。全期望的公式:E(Y) = E(E(Y|x)) = sgm(P(X=xi)E(Y|X = xi)原创 2012-10-04 21:55:37 · 523 阅读 · 0 评论 -
POJ 1241 Knockout Tournament
Knockout TournamentTree DP 。很有意思的一个题目。给定了2^n个人每轮比赛的结果,然后推测每个人可能的最高排名与最低排名。由于给的是每轮比赛的结果,所以题目在数据的读入与处理方面比较麻烦。如果编号为i的人赢了编号为j的人,那么我们连有向边(i,j),即j为i的孩子。这样我们只需要处理出每轮比赛的两个人之间的关系即可。由于数据的最后一个肯定是树的根节点,然后我们从后往前原创 2012-10-04 23:16:32 · 643 阅读 · 0 评论 -
POJ 3345 Bribing FIPA
Bribing FIPATree DP。由于选定某棵子树的根之后,所有的子节点都被选择。我们先处理出不考虑树根的情况,选择j个点所需要的最小花费。然后对于每个j进行判断,如果对应的价值大于树根的价值,就更新。直接看代码:/* *author : csuchenan *PROG : POJ3345 *Algorithm : Tree DP dp[i][j]表示以i原创 2012-10-02 22:59:47 · 435 阅读 · 0 评论 -
POJ 3342 Party at Hali-Bula
Party at Hali-Bula好久没有写解题报告了,这次把上个月做的一些题都写写,上个月做了不少的树形DP,先从这个比较简单的入手。这个题目与hdu 1520 Anniversary party那道很裸的树形DP差不多,只不过这道题不仅要求出最多的人,还要判断是不是唯一。主要是如何判断人数是不是唯一的。出现多解的情况可能有如下两种,如果对于根节点而言,选与不选的解是相同的,则说明这样原创 2012-10-01 22:08:32 · 580 阅读 · 0 评论 -
POJ 1155 TELE
TELE这个题目搁置了好久才有重新拿过来做的。题目意思不难理解。TreeDP + 分组背包 方程: dp[i][j] = max{ dp[i][j] , dp[i][k] + dp[s][j-k] - edge[i][s]},其中s表示i的儿子节点,edge[i][s]表示i到s的边权,dp[i][j]从树根i的子树中选取j个叶子所需要的最小代价。不过这个题目比较卡时限,需要优化。由于叶子原创 2012-10-01 22:20:08 · 501 阅读 · 0 评论 -
POJ 2486 Apple Tree
Apple Tree继续将树形DP题目给与整理。这个题目能很容易想到状态,dp[i][j]表示以i为根的子树中走j步所能获得的最大值。但是这样状态转移的时候比较难写,而状态转移比较麻烦的原因在于不能确定走到了哪一步。我们增加一维,dp[i][j][2],其中dp[i][j][0]表示要回到根节点,dp[i][j][1]表示不回到根节点。这样我们就很容易能得到状态转移方程了,很容易推出来,具体看原创 2012-10-02 22:47:27 · 394 阅读 · 0 评论 -
POJ 4045 power station
POWER STATIONProblem B. Power Station Description The massive tsunami that struck the coastal city has washed away many ofinhabitants and facilities there. After the tsunami, t原创 2012-07-13 15:55:57 · 956 阅读 · 0 评论 -
POJ 3667 Hotel
Hotel线段树:区间合并。首次写区间合并,开始的时候没有想明白怎么做。看了别人的解题报告,终于明白了操作的各种过程。其实与前面的线段树题目没什么太大的区别。主要是在线段树节点保存的值上多增加了一些。首先看节点域:struct Tree{ int l , r , lans , rans , mans , f ;}一共五个变量,l,r的含义与之前相同,为该区原创 2012-08-31 20:02:38 · 408 阅读 · 0 评论 -
POJ 3349 Snowflake Snow Snowflakes
Snowflake Snow Snowflakes哈希。首先是哈希函数的选择,先将每组的六个数字进行求和,然后对一个较大的素数取模。在就是判同构的问题,给定两个数字串,判定是不是循环同构的。因为本题中只有六个,所以我们直接枚举就可以了。#include #include #include #define maxn 100005#define mod 1000原创 2012-08-20 09:10:19 · 394 阅读 · 0 评论 -
POJ3692:Kindergarten
http://poj.org/problem?id=3692题目大意:有一群男孩,他们互相认识,有一群女孩,她们也互相认识,这些男孩中有以些认识女孩中的某些人,现在找出一群孩子使得他们都认识,并且数目最多。有题目给定的条件,可以很容易的将其判定为二分图的匹配,但是要从其中找出都互相认识的,并且使得数目最大,比较困难,我们可以逆向思考,找出一个集合使得其中的人数最多,并且集合中的所有人都原创 2012-04-09 14:54:49 · 412 阅读 · 0 评论 -
POJ1860:Currency Exchange
http://poj.org/problem?id=1860题目类似于套汇,不过多加了一个条件,就是每次转换的时候有一定的手续费。直接用bellman-ford算法,注意数据是double类型的,所以初始化的时候,还是使用循环比较好,直接用memset函数会出错。再有就是对于更新的次数要在10000左右,开始的时候没让循环那么多次,结果wrong,改成10000之后就AC了。代码如下:原创 2012-04-09 19:26:08 · 315 阅读 · 0 评论 -
POJ 2488 A Knight's Journey
A Knight's JourneyDFS题目,采用回溯的方式接着道题目,这个题目,是求序列中最小的,那么我们只需保证在搜索的时候每次都搜索为搜索的序列中最小的即可。只需要在搜索方向的时候注意一下即可。优先搜索靠近左侧的,同样的情况下优先搜索靠近底边的。代码如下:#include#includeint map[30][30] ;int dir[][2] ={{-2 , -1} ,原创 2012-06-11 14:51:10 · 320 阅读 · 0 评论 -
POJ 2352 Stars
Stars题目意思很简单,就是查找每个度的个数,度被定义为:一个点其左下方所有点的个数。由于输入的时候已经为我们排好序,这样考虑,每次插入一个点的时候,我们只需要考虑其左侧的点的个数,而忽略它们的高度问题。这是因为输入的时候已经按高度排序了,这样就可以直接用线段树查找。程序如下:#include#include#define MAXN 32010struct Node{ in原创 2012-06-11 12:18:12 · 324 阅读 · 0 评论