上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 25 下一页
摘要: 题目链接:http://poj.org/problem?id=1236 题意:向一些学校分配一种软件,有些学校获得软件后可以分配给其它学校(有向边),分别求:1.最少要分配多少个软件使得所有学校都能获得软件。2.最少要加几条边使得只要分配一个软件给其中任意一个学校,其它学校都能获得软件。 对于第一个问题很好求,就是入度为0的强连通分量中的点的个数。对于第二问,就是加多少条边使得图是强联通的,考虑那么只要考虑入度为0和出度为0的强连通分量,使得他们能成环,那么就是它们之间的最大值,注意一个强连通分量时要特殊考虑。 1 //STATUS:C++_AC_0MS_216KB 2 #incl... 阅读全文
posted @ 2013-05-21 10:55 zhsl 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2553 题意:在有向图中,求出一些点,自己能到达的点一定能到达自己。 简化模型,就是求出度为0的强连通分量中的那些点。 1 //STATUS:C++_AC_79MS_712KB 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 //#include <ext/rope> 6 #include <fstream> 7 #include <sstream> 8 #inclu 阅读全文
posted @ 2013-05-21 02:03 zhsl 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 1877题目链接:http://poj.org/problem?id=1887 3903题目链接:http://poj.org/problem?id=3903 数据大,线性优化,O(n*logn)。1877: 1 //STATUS:C++_AC_16MS_172KB 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 //#include <ext/rope> 6 #include <fstream> 7 #include <sstream 阅读全文
posted @ 2013-05-21 01:53 zhsl 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=1631先确定一方有序后,就是LIS问题了。 仔细观察上图:红色航线是合法的,那么他们满足什么规律呢? C1 C2 C3 C4北岸红线的端点: 4 9 15 17南岸红线的端点: 2 8 12 17 D1 D2 D3 D4不难看出无论线的斜率如何,都有这样的规律: C1<C2<C3<C4 且 D1<D2<D3<D4如果我们把输入数据排升序,问题变抽象为:在一个序列(D)里找到最长的序列满足DI<DJ<Dk……且i<j<k这样的话便是典型的最长非降子序列问题了。。。。法... 阅读全文
posted @ 2013-05-21 01:48 zhsl 阅读(470) 评论(0) 推荐(0) 编辑
摘要: 联合训练赛中遇到的(以后留给新生做):1.排列的逆序数题目描述{1,2...n}的所有排列中逆序数为k的排列个数。输入多组样例,每组样例: n, k ( 1≤n≤100, 0≤k≤n*(n-1)/2)输出对于每个样例,输出排列个数,答案模1000000007。样例输入2 1样例输出1简单DP,转移方程: f[i][j]为前i个数所有排列中逆序数为j的个数,则f[i][j]=Σ( f[i-1][k] | max(0,j-i+1)<k<=j )。 1 //STATUS:C++_AC_93MS_1348KB 2 #include <functional> 3 #include 阅读全文
posted @ 2013-05-21 01:39 zhsl 阅读(372) 评论(0) 推荐(1) 编辑
摘要: 题目链接:http://poj.org/problem?id=1877 赛前水一题,希望明天的邀请赛能取得好的成绩! 1 //STATUS:C++_AC_110MS_200KB 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 #include <fstream> 6 #include <sstream> 7 #include <iomanip> 8 #include <numeric> 9 #include <c 阅读全文
posted @ 2013-05-10 23:44 zhsl 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 2008年OI集训论文上有介绍<对块状链表的一点研究>,其主要是结合了链表和数组各自的优点,链表中的节点指向每个数据块,即数组,并且记录数据的个数,然后分块查找和差入。在g++头文件中,<ext/rope>中有成型的块状链表,在using namespace __gnu_cxx;空间中,其操作十分方便。 基本操作: rope list; list.insert(sta,string); list.erase(sta,end); list.copy(sta,len,string); 算法复杂度n*(n^0.5),可以在很短的时间内实现快速的插入、删除和查找字符串的效果,简 阅读全文
posted @ 2013-05-06 01:25 zhsl 阅读(1432) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=1204 从字符矩阵的边缘字符扩展匹配分别记录最小值。 1 //STATUS:C++_AC_704MS_12432KB 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> 阅读全文
posted @ 2013-05-04 01:56 zhsl 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=3691 首先庆祝1A。 如果是单串的匹配,那么状态转移方程就是f[i][j],表示匹配串的前 i 位最近9个数字的状态是 j 的最小改动,每个状态用状态压缩表示下就可以了。复杂度是指数级,对于较小的字符串还是可以接受的。但是这个有很多不必要的情况,因为很多转移都可以归纳到一起,即修改或者不修改,因此把方程改为表示匹配串的第 i 为模板串的第 j 个节点时的最优解,那么对于每个节点就只有4种转移状态了,即一个单串的DFA。同样,我们对于多个串建立一个AC自动机就可以了,转移方程:f[i][j]=Min{ f[i][j] ,... 阅读全文
posted @ 2013-05-03 21:36 zhsl 阅读(313) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://poj.org/problem?id=2778 [摘自Matrix67] 题目大意是,检测所有可能的n位DNA串有多少个DNA串中不含有指定的病毒片段。合法的DNA只能由ACTG四个字符构成。题目将给出10个以内的病毒片段,每个片段长度不超过10。数据规模n<=2 000 000 000。 下面的讲解中我们以ATC,AAA,GGC,CT这四个病毒片段为例,说明怎样像上面的题一样通过构图将问题转化为例题8。我们找出所有病毒片段的前缀,把n位DNA分为以下7类:以AT结尾、以AA结尾、以GG结尾、以?A结尾、以?G结尾、以?C结尾和以??结尾。其中问号表示“其它情况. 阅读全文
posted @ 2013-05-03 11:25 zhsl 阅读(319) 评论(0) 推荐(0) 编辑
摘要: 题目链接: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 阅读(484) 评论(0) 推荐(0) 编辑
摘要: 八数码问题,对于一般的数据,BFS+逆序对HASH就可以解决了,或者双广搜索。进一步的话就是A*优化,A*的启发函数有以下两种:1,不在相应位置的格子数目; 2,不在相应位置的曼哈顿距离之和;显然第二种的效率比较高。一中兼顾效率,写起来有方便的算法就是IDA*,因为不要判重,而且是DFS,代码量小。还有猥琐点的方式就是从目标状态向所有状态扩展打表。。。 对于八数码问题,还有一个重要剪枝,那就是逆数对的剪枝,如果开始状态的逆数对数目是奇数则必无解,否则一定有解。因为对于目标状态的逆序对是0,即偶数,而操作只能与0交换,而0是不会影响结果的,只有于0交换的数会影响结果,但是那个数移动也会没有... 阅读全文
posted @ 2013-04-30 21:44 zhsl 阅读(485) 评论(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 阅读(237) 评论(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 阅读(327) 评论(0) 推荐(0) 编辑
摘要: 程序员之路--关于代码风格 优秀的代码风格如同一身得体的打扮,能够给人以良好的印象。初学程序设计,首先必须建立良好的编程习惯,这其中就包括代码风格。本文就代码风格中的几个重点问题进行了讨论,并在文后给出了一份优秀的代码作为风格模板。代码风格不必花费太多专门的时间研究,在使用中不断模仿模板代码,轻轻松松就能写出“专业的代码”。一、80字符,代码行极限 无论时空怎么转变,世界怎样改变,一行80字符应始终铭记心间。古老的Unix终端以80列的格式显示文本,为了让源代码与手册具有最佳的可读性,Unix系统始终坚持着80列的传统。80列不多不少,足够写出一行有意义的代码,同时也足够显示在终端屏幕,足.. 阅读全文
posted @ 2013-04-25 18:21 zhsl 阅读(221) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 25 下一页