自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 poj 1923 dp(Fourier's Lines)

题意:给定两个正整数n和m,问n条直线交于m个点最多能把平面分成多少部分。要求不会多于两条直线交于一点。思路:dp。知道是dp可是自己还是在一个地方卡住了,忍不住搜了题解发现也比较好理解。#include #include int dp[105][10005];int n,m,c=1;int out(int y,int x){ return yx*(x-1)/2) || (

2015-03-31 23:42:21 683

原创 poj 1787 多重背包(硬币付款不找钱)

题意:分硬币,有1,5,10,25四种硬币,给定每种硬币的数量,给定要组合成的价值,问刚好达到价值时用的硬币最多的情况。思路:dp[j] 表示 j 块钱最多由多少块硬币组成, used[j] 表示 j 块钱时,已经放了多少同种类的硬币。(实际上path用一维数组即可,使得 path[j] 表示 上一次最多有多少块构成的 j 块钱)#include #include #include

2015-03-30 23:55:46 610

原创 poj 2121 字符串(英文数字->阿拉伯数字)

题意:把英文的数字翻译成阿拉伯数字。思路:字符串模拟。#include #include #include using namespace std;mapmm;char s[2000],t[2000];void init(){ mm["zero"] = 0; mm["one"] = 1; mm["two"] = 2; mm["three"] =

2015-03-25 20:35:12 653

原创 poj 3250 单调栈(看到前面的牛的数量)

题意:一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。给出这些牛的高度,要求每头牛可以看到的牛的数量的和。思路:单调栈(类似2559和3934),栈中按照递减顺序保存牛的高度,对于当前牛判断它入栈的位置。其实stack不必设置h域,stack只存下标即可,找栈中高度用s[下标]就行了。看到另一

2015-03-25 19:21:27 745

原创 poj 1941 递归输出图形(Sierpinski Fractal)

题意:递归输出图形。Fractal:分形。分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。分形一词,是芒德勃罗创造出来的,其原意具有不规则、支离破碎等意义。Fractal1973年,芒德勃罗(B.B.Mandelbrot)在法兰西学院讲课时,首次提出了分维和分形的设想。思路

2015-03-19 23:28:47 961

原创 poj 1966 最大流求点连通度

题意:给定一个无向图,求最少删去多少个点可以使图不连通。思路:根据Menger定理(图的连通度为k,则任意点间必有k条不相交路径),这样建图,首先将每个点拆成两个点,每个点可以表示成i与i+n。那么有向边的容量为1,如果i与j相邻,那么有有向边==INF。然后枚举源点和汇点求最大流。如果最大流都是INF,那么代表这个图是一个完全连通图,最小割点集为n;否则就输出最大流。此题不枚举点对,固定

2015-03-19 09:51:21 609

原创 poj 2348 欧几里得博弈

题意:给定两个数,两个人轮流操作,先把其中一个数变为0的人赢。这种操作是用把大数变为大数减小数的若干倍的差(不能小于0)。问谁能赢。思路:(http://www.cnblogs.com/rainydays/archive/2011/05/24/2055841.html说的很好)谁先抢到关键态,谁就能赢。关键态就是大数是小数的二倍多。一个人一旦抢到了关键态,就可以直接操控下面一连串的非关键态的次

2015-03-18 23:24:28 618

原创 poj 2954 皮克定理(求三角形内部的整数坐标数)

题意:给定三个整数坐标点作为三角形的三个顶点,求在此三角形内部的点的数量。思路:Pick(皮克)公式:平面上以格子点为顶点的简单多边形,如果边上的点数为on,内部的点数为in,则它的面积为area=on/2+in-1。可以用归纳法进行证明。有一个技巧就是利用gcd求每个边上的整数点数:即一条线段(端点都是整数坐标)上的整数点数-1是端点横坐标之差的绝对值和纵坐标之差绝对值的最大公约数。比较

2015-03-17 23:55:47 1437

原创 poj 2250/3356 LCS(文章LCS/AGTC)

题意:给定两篇文章,以词为单位做LCS。思路:dp,需要输出LCS方案,我用的递归输出,打表当然也可以。#include #include #include #include using namespace std;#define N 105int dp[N][N];int lena,lenb;char s[N][35],t[N][35];void print(int x

2015-03-17 23:34:47 367

原创 poj 1087 最大流(让尽可能多的电器能够供电)

题意:有插座和电器两种物品。首先有n种插座,n种插座用字符串表示,这n种插座可以理解为是插在电源上的插座。然后有m个电器,现在电器要充电,电器用字符串表示,每个电器都有自己可以插(且只可以插)的插座(这个插座可以不是那n个插在电源上的插座,可以是其他的插座)。现在有k个信息,s1 s2代表s1插座可以插到s2插座上去,这里类似于将插头转换了一下,这些s1与s2也可以不是那n个插在电源上的插座。给出

2015-03-16 23:35:11 861

原创 poj 1837 背包(让天平平衡的方法)

题意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。思路:(http://blog.csdn.net/lyy289065406/article/details/6648094/写的非常详细)首先定义一个平衡度j的概念当平衡度j=0时,说明天枰达到平衡,j>0,说明天枰倾向右边(x轴右半轴),j那么此时可以把平衡度j看做

2015-03-16 22:42:10 688

原创 poj 3017 dp+单调队列(拆分序列)

题意:给定一个有n个数字的序列,现要将此序列分成几段,使得每段数字的和不大于给定的数字m。并且求使得各段和的最大值最小。思路:一个n^2的dp比较容易想到。令f[i] 表示前i个数按照题目要求的最小的和,则必然有f[i] = min(f[j] + max(a[j +1 , a[j + 2].....a[i])) ,其中j<= i,j的位置还得满足题目中m的限制。由于a数组都是大于0的,所以可以

2015-03-15 23:25:55 488

原创 poj 2226 hungary(铺木板)

题意:给定一个矩阵,其中有一些地方有水,用一些长度任意,宽度为1的木板盖住这些有水的地方,问至少需要几块板子。思路:还是二部图最小点覆盖(==最大匹配),只不过建图需要把每条边拆成几段连续的点,行和列都这么处理。#include #include #define N 1255int b[N],g[N][N],n,m,lk[N],used[N],lena,lenb;char s[52

2015-03-15 13:11:19 386

原创 poj 1734 Floyd输出路径(长度大于等于3的最小圈)

题意:给定一个无向带权图,求其中长度大于等于3的最小圈(实际上长度等于2的圈就是重边,所以存边的时候忽略重边,只存储权值最小的边)思路:Floyd的应用。找到圈的办法就是判断d[i][j] + map[i][k] + map[k][j] k -> j -> j到i的最短路)这样一个环就找到了,接下来我们要记录路径,用path[i][j]表示在最短路i到j的路径上j的前一个结点,所以我们在更新

2015-03-15 11:05:19 700

原创 图灵机

一、图灵机的一些特点:双向读写(注意DFA和PDA只是可读,而图灵机可读写)头、无穷带、停机状态。二、单带图灵机的定义:TM M为一个七元组(有穷状态集、输入字母表、带字母表(通常比输入字母表大、因为还包括可以写上去的字符)、转移函数(需标明向左还是向右)、初始状态、停机接收状态、停机拒绝状态)。注意一个状态不能同时为接受状态和拒绝状态,所以一个TM至少有两个状态。输入带上除了输入串之外的地方

2015-03-11 08:56:32 3478

原创 poj 1095 递归(Catalan)

题意:将二叉树编号,给定一个数字,求其对应的二叉树。思路:递归。题目中蕴含了Catalan数,即结点数为n的二叉树的不同形态为第n个Catalan数。所以先筛出前几个Catalan数,然后求得n对应应该有多少个结点,并求出其在相应节点数中的序号。随后递归处理:求出其左右子树应该具有的节点个数及其在相应的结点个数下得序号。#include #include long long c[20]

2015-03-10 16:50:39 470

原创 poj 2769 暴力(memset的限制)

题意:给定n个不同的数字,求一个最小的数字m,使得这n个数字对m取模后仍然各不相同。思路:没什么好的思路(二分显然不行,比如12和20这两个数模8同余,但是模7不同余),只能暴力。但是此题对memset有时间限制,hash的过程中如果每次都清空整个数组则会TLE,只清空本次枚举的m所需要的大小才能AC。#include #include #define max(a,b) ((a)>(b

2015-03-10 13:13:16 584

原创 poj 3222 图的dfs(长度为2的路径覆盖全图)

题意:给定一个边数为偶数的图G,求一个边的配对,使得每一对边共用一个顶点。(也即给出一个P3的覆盖)思路:参考的别人的思路,一遍dfs即可,O(m)复杂度。如果你把一个点u拿出来,然后DFS它所有相邻的点。对于一个还没有访问过的点v,做完它有2种可能性:它剩下一条边(v, w)无法匹配。那我们就构造(u, v, w)这样一对它完美的被解决了,那么我们(u, v)这条边就会悬空,不过

2015-03-10 09:01:04 839

原创 poj 3233 矩阵快速幂

题意:给定一个n*n矩阵A,一个常数k和另一个常数m,求S = A + A^2 + A^3 + … + A^k。思路:构造新矩阵T={A I },则T^k={A^K   I+A+A^2+A^3+...+A^(K-1)}                                   I  I                   0                     I显然只要

2015-03-09 21:11:01 312

原创 poj 2114 树分治(是否存在长度恰为k的路径)

题意:给定一棵树,随后给出不多于100个查询k,问树上是否存在恰等于k的路径。思路:对每一个k做一遍树分治,与1714的区别就是update函数的写法,此题要求的是路径距离恰等于k的条数。(其中判断条件j>i没加到时tle了两天,苦苦debug才AC)。#include #include #include #define clr(s,t) memset(s,t,sizeof(s))

2015-03-09 14:37:43 551

原创 下推自动机及其泵引理(PDA)

一、一个下推自动机为一个六元组:PDA M=(有穷状态集、输入字母表、栈字母表、转移函数、初始状态、接受状态集)。其中输入字母表含有episilon,所以后面所说的PDA实际上都是非确定性PDA。二、PDA与CFG两者等价。通过两个方向来进行证明:1、如果一个语言是CFL,则存在一个PDA能够识别它。

2015-03-08 19:36:49 3702

原创 正则表达式与有穷自动机

一、正则表达式的递归定义:R是正则表达式当且仅当R是一下六种之一:1、字母表中的单个字符;2、epsilon;3、∅;4、R1∪R2(其中R1和R2都是正则表达式,下同);5、R1R2;6、R1*二、优先级:星号>连接>并三、几个恒等式:R∪∅=R;R∪epsilon=R∪{epsilon};R∅=∅;∅*={epsilon};

2015-03-08 12:25:48 3074

原创 poj 1741(1987) 树分治(求距离小于某值的点对数)

题意:给定一棵带权无向树,并给定一个整数m。求树上点间最短路不大于m的点对数量。思路:比较明显的思路是用LCA来做,但问题是用LCA的话,当前问题的查询数量级为n^2,所以不管使用离线LCA还是在线LCA都逃不过O(n^2)的复杂度。经过学习知道了树分治这种东西。将无根树转化成有根树进行观察。满足条件的点对有两种情况:两个点的路径横跨树根,两个点位于同一颗子树中。如果我们已经知道了此时

2015-03-08 09:57:38 709

原创 poj 3714 分治法求最近点对

题意:在一个平面上给定两种点A类和B类的坐标,求A类中某点a和B类中某点b的最近距离。思路:和同一类点几乎相同,只需手工设定同一类点间距离为无穷即可(或者每次比较时判断一下亦可)。方法就是经典的分治法:按x排序一分为二,先递归判断两边的最近距离,然后判断中间的“竖带”上的最近点距。判断中间竖带时按照y排序,而且只要向前判断7个点即可。#include #include #include

2015-03-07 13:49:40 665

原创 上下文无关文法(CFG)

一、上下文无关文法:G=(V,sigma,R,S),1) V: 有穷变元集2) sigma: 有穷终结符集3) R: 有穷规则集4) S∈V: 初始变元二、定理:正则语言都是上下文无关语言。证明方法:可以为每个正则语言设计上下文无关文法。其中CFG的V等于DFA的状态集;转移(qi,a)=qj对应规则:Ri := aRj;终结符qi∈F对应规则:Ri := 空。三、几个例子

2015-03-07 10:06:52 3490

原创 poj 2509 简单模拟(烟屁换烟)

题意:Peter一开始有n颗烟,已知没抽完m颗可以再得到一颗烟,问他最多能抽多少颗烟。思路:每轮对于所有烟屁,先换最多的烟抽完,得到新的烟屁数量。#include #include long long n,m;int main(){ while(scanf("%lld %lld",&n,&m)!=EOF) { long long res = n;

2015-03-06 21:57:36 448

原创 poj 3160/3249 强连通分量+dp(SPFA)(正的评价值才发礼物)

题意:某人要去给n个人送礼,每个人在不同的地方,且他们之间共有m条单向边。另外每个人会提供一个舒心值(也即点权)。现此人任选某个人开始,可以沿单向边访问下一个人。对每个节点可以选择给他礼物并获得相应舒心值或者什么也不做(其中没给过礼物的点可以访问多次,但给过礼物的点只能访问一次),求他能获得的最大舒心值。思路:首先可以证明在一个强连通分量中可以获得所有正的权值并舍弃所有负的权值。然后通过缩点形

2015-03-05 12:47:28 385

原创 poj 3114 强连通分量+最短路(间谍通信)

题意:给定一个有向带权图,随后给出q个查询(a,b),求a->b的最短花费。其中如果这两个city属于同一个国家,则花费时间为0。两个city同属于一个国家当且仅当这两个city互相可达。思路:属于同一个强连通分量的点就是属于同一个国家了。然后进行缩点,在缩点之后的图上求最短路即可。一开始看到多组查询而且点数不多就写了Floyd,但是TLE。随后改成每次查询就来一次SPFA,这样AC。#i

2015-03-04 22:27:32 456

原创 poj 2763 lca(rmq)+树状数组(在一棵树上妈妈叫回家)

题意:给给定一棵含n个结点的树,树上的权值表示距离。共有q次操作,操作分为两种0 c :求从当前位置s到c的距离,然后当前位置变成c1 a b:把第a条边的权值变为b思路:树上的最短距离显然通过lca来求,而边权值会随时改变,所以求lca应该采用在线rmq方法。难点在如何更新,应用树状数组。可以深搜保存遍历该点的时间戳,s[i] 表示第一次遍历到该点的时间戳, t[i] 表示回溯到该点

2015-03-04 14:59:16 550

原创 poj 2750 线段树(带更新的环形最大子序列)

题意:给定一个环形序列,可以进行在线操作,每次修改一个其中元素。每次修改之后立即输出环上的最大连续子序列的和,要求子序列的长度不得为n,也即不能是整个环。思路:比较复杂的线段树(http://blog.csdn.net/non_cease/article/details/7437690)把环从一个地方切断拉成一条直线(最直观当然是从n~1之间切断),用线段树记录当前区间的非空最大子列和当前区间

2015-03-04 11:14:37 628

原创 有穷自动机的相关概念

几个相关概念:1、正则语言:能够由有穷自动机接受的语言。2、正则运算:设AB是两个语言,则A和B的并、连接以及星号运算均为正则运算。3、引理:正则运算对补封闭。证明要点:一个有穷自动机识别语言的补集是将终结符号在符号集上取补。4、定理:正则语言对正则运算封闭。证明法一:根据两个正则语言A、B对应的DFA构造新的DFA。法二:构造相应NFA。5、NFA包括两点变化:下一个状态可以

2015-03-03 20:05:54 922

原创 poj 2201 笛卡尔树

题意:给定n个二元组(ai,bi),构造笛卡尔树。按a元素为二叉排序树,按b元素为小顶堆。思路:用栈当然可以,此处用了rmq来做。另外需要注意笛卡尔树和treap的区别:Treap与笛卡尔树在结构上是相同的,只是两者的应用不同。treap的value是随机值,是为了使树更加平衡引进的,而笛卡尔树的value是一个确定的值。#include #include #include #inc

2015-03-03 15:03:47 494

原创 poj 1951 模拟(Krunch字串)

题意:无聊的字符串模拟。每个字符只输出第一次出现,并且过滤掉元音。思路:模拟。注意标点之前不能有空格(代码中space变量的作用,而不是每个单词后直接输出空格)#include #include #define N 75char s[N];int used[30];int isvowel(char x){ return x=='A'||x=='E'||x=='I'||x=

2015-03-03 12:32:32 447

原创 poj 1785 构造笛卡尔树(右链插入/RMQ)

题意:给定n个(label,priority)的二元组,以此构建笛卡尔树。所谓笛卡尔树(treap),看label为二叉排序树,而看priority为堆。思路:(http://www.cnblogs.com/rainydays/archive/2011/06/15/2081266.html)先把节点按lable排序,从小到大依次插入,这样每次插入的节点就要插到排序二叉树的最右边。之前先建立一个

2015-03-02 20:44:33 644

原创 poj 1012 Joseph环问题

题意:有k个好人和k个坏人,问想要先处死k个坏人的最小间隔为多少?思路:k比较小(k=1 , 总人数2n,人编号从0~2n-1,则n-i为第i轮剩余的人数),相当于每轮都把比死者序号大的人的序号减1。#include #include int res[16];int n;int main(){ memset(res,0,sizeof(res)); while(sca

2015-03-02 13:54:13 342

原创 poj 2762 强连通分量+拓扑排序(判断图是否为单向连通)

题意:给定一个有向图,判断此图是否为单向连通(=半连通)。(注意单向连通和弱连通的区别:前者是图中任意两点u和v,或者有uv路或者有vu路;后者是有向图的基图是连通图)思路:先求出强连通分量,然后判断拓扑排序是否为一。记得算法课讲过一个DAG图是单向连通当且仅当其拓扑排序唯一。据此此题可解。#include #include #define min(a,b) ((a)<(b)?(a):

2015-03-01 15:05:08 1489

原创 poj 2553(3180) tarjan强连通分量(找图的“sink”点)

题意:定义图的bottom集合为:bottom(G)={v∈V|∀w∈V:(v→w)⇒(w→v)}。思路:依题意,所求即求出强连通分量缩点后出度为0的那些强连通分量中得点。用tarjan算法即可。#include #include #include #define min(a,b) ((a)<(b)?(a):(b))#define clr(s,t) memset(s,t,sizeo

2015-03-01 10:20:00 454

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除